mysql数据库解决中文乱码问题
安装mysql之后,如果存储中文,再读出的时候就会出现乱码问题。现在的字符集有几百种之多,都是一些公司或者组织定义的。我们应该使用能够容纳世界全部语言全部字符的字符集,这样就不会再出现乱码问题。这就是现在通用的UTF-8。要理解编码就应该区分字符集和编码格式是说的同一问题的两个方面。
导致乱码的原因是存储和读取时采用的是不同的字符集。
推荐在建库之前修改编码格式:
一、进入mysql(mysql -uroot -p),查看当前数据库字符集(status;)
二、#vim /etc/mysql/my.cnf
三、
[client]
default-character-set=utf8
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
四、重启mysql(/etc/init.d/mysql stop /etc/init.d/mysql start)
上面是建库之前的操作,如果是数据库正在使用,然后发现编码格式不对应该怎么办呢?
一、导出表结构:mysqldump -uroot -p --default-character-set=gbk -d databasesname > createtable.sql
二、手工修改createtable.sql中的表结构定义的字符集为新的字符集。
三、确保记录不再更新,导出所有记录。
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename>data.sql
--quick:转存大表时使用,一次次检索表中的行,而不是一次检索所有行,输出时存储在缓存。
--no-create-info:不导出建表语句。
--extended-insert:使用包含几个VALUES列表的多行INSERT语法。
--default-character-set=latin1:按照原有字符集导出,这样在导出文件中所有中文都是可见的。
四、打开data.sql,将SET NAMES latin1改为SET NAMES gbk
五、使用新的字符集创建新的数据库。
create database databasename defaule charset gbk;
六、创建表,执行createtable.sql
mysql -uroot -p databasename < createtable.sql
七、导入数据
mysql -uroot -p databasename < data.sql
下面是我国自定义的一些编码标准:
1)GB2312-80:1980年发布,双字节编码字符集。
2)GB13000:1993年发布,使用很少,只是一个形式上的标准。
3)GBK:1995年发布,因为得到了windows 95的支持大行其道。
4)GB18030:2000年发布,没怎么听过。
下面是常用字符集的比较:
1)ASCII,定长,单字节7位编码,最早的奠基性编码。
2)GBK,定长,双字节编码,自持广泛。
3)UTF-8,不定长,1-4字节编码,互联网和UNIX广泛支持的Unicode字符集。
4)UTF-16,不定长,Java等内部使用的字符集。
字符集如何选择呢:
1)在多国使用,国际化的范儿,使用Unicode,也就是UTF-8。
2)如果数据库中已有数据的导入,就要考虑数据库字符集对已有数据的兼容性。
3)数据库只支持中文,数据量很大,性能要求高,可以使用双字节编码的GBK,因为相比于UTF-8的3字节,空间占用更少。
4)如果数据库要做大量的字符运算,如比较排序等,定长的比不定长的更快。
5)客户端普遍采用的字符集格式。
mysql支持多种字符集,在同一台服务器,同一个数据库,甚至同一个表的不同字段都可以制定不同的字符集。
可以只用命令show character set; 插卡看支持的字符集。相对字符集还有校对规则的问题,可以查阅相关资料。
mysql字符集的设置:
有四个级别:服务器级,数据库级,表级和字段级。
1)数据库字符集的设置:在my.cnf(windows为my.ini)中设置:[mysqld]character-set-server=utf-8 在启动选项中设置:mysqld --character-set-server=utf-8 也可以在编译时制定。
2)数据库字符集和校对规则,可在创建数据库时制定,也可在创建之后通过alter database命令修改。
3)标的设置同上,要显示表的字符集和设置规则可以通过show create table命令查看。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。