本文包含了乱码的解决方案,和编码规则的选择方案以及mysql数据库编码规则的转换
mysql不乱码的终极方案
1.linux系统层
修改/etc/sysconfig/i18n 文件,在my.cnf不指定默认字符集的情况下。
vim /etc/sysconfig/i18n
LANG='zh_CN.UTF-8' #如果my.cnf中[client]不指定,默认使用系统字符集
2.连接linux系统使用的客户端层(xsehll,securt等远程连接端)
设置字符编码格式为UTF-8
3.mysql连接客户端解决方式
在mysql命令行模式下执行set names utf8;(临时)
影响的参数:
show variables like 'character_set%';
character_set_client | utf8 #客户端来源数据使用的字符集
character_set_connection | utf8 # 连接层字符集
character_set_results | utf8 #查询结果字符集
mysql> set names utf8;
Query OK, 0 rows affected (0.01 sec)
登录mysql的时候指定默认字符集(临时)
[root@node1 ~]# mysql -S /tmp/mysql.sock4 --defaults-character-set=utf8 #-S 指定多实例mysql的套接字文件,
使用--defaults-character-set 指定默认字符集。
修改my.cnf 文件,下面两个字段在任意一个字段都是可以的。
[client]
default-character-set=utf8 #建议使用第一个
[mysql]
default-character-set=utf8
注:如果未配置mysql客户端的编码格式,则会去采用系统默认的编码格式( cat /etc/sysconfig/i18n LANG="zh_CN.UTF-8")
4.服务器字符集选择。
[mysqld]
#数据库的默认字符集
character-set-server=utf8 #添加这条语句,可设置服务器端字符集。
mysql服务端重新启动后,这两个参数会改变为设定值。
影响的参数:
show variables like 'character_set%';
character_set_database | utf8 #当前选中数据库的默认字符集
character_set_server | utf8 #默认的内部操作字符集
字符集选择的方案
1、如果处理各种各样的文字,发布到不同语言国家地区,选择Unicode。,对mysql对号utf-8。
2、只需中文,数据量很大,性能要求也高,选择gbk.。
3、处理移动物联网业务,选utf8mb4
建议在能够完全满足应用的前提下,尽量使用小的字符集。因为更小的字符集意味着能够节省空间、减少网络传输字节数,同时由于存储空间的较小间接的提高了系统的性能。
将一种编码的数据库转换为另一种编码的数据(中途转换编码规则)
alter database dbname character set xxx; #只能对以后的数据有效,对之前的数据无效。基本不使用
常用转换数据库字符集方案
mysqldump -S /tmp/mysql.sock4 --default-character-set=utf8 -d test > /data/test-`date +%F`.sql #1、导出表结构而不导出数据,-d参数是只导出表结构
vim /data/test-`date +%F`.sql
DROP TABLE IF EXISTS `table10`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `table10` (
`id` int(11) DEFAULT NULL,
`names` char(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; #2、这里的CHARSET改为你想要修改的字符集
mysqldump -S /tmp/mysql.sock4 --extended-insert --no-create-info test > /data/test-data-`date +%F`.sql #3、导出数据内容
vim /data/test-data-`date +%F`.sql
LOCK TABLES `table10` WRITE;
set names utf8; #4、这一行是多加的,自己指定想要转换的字符集
INSERT INTO `table10` VALUES (1,'云中鹤');
UNLOCK TABLES;
mysql> create database if not exists test; #5、创建数据库,存储转换后的数据
Query OK, 1 row affected, 0 warning (0.00 sec)
mysql -S /tmp/mysql.sock4 test < /data/test-`date +%F`.sql #6、导入表结构
mysql -S /tmp/mysql.sock4 test < /data/test-data-2015-09-25.sql #7、导入表数据