专注 K8S研究
分类: Mysql/postgreSQL
2013-07-24 01:37:50
原文地址:MySQL命令显示——字符集问题 作者:ning_lianjie
ERROR 1267(HY000):Illegal mix of collations
类似上面的错误,则为字符集问题
可查看原理部分,如果我用程序插入字符集为utf8的字符,要在mysql客户端正常显示,则需要把character_set_results设置为utf8格式
例如
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 | 客户端字符集
| character_set_connection | latin1 | 客户端与服务器端连接采用的字符集
| character_set_database | utf8 | 数据库采用的字符集
| character_set_filesystem | binary |
| character_set_results | latin1 | SELECT查询返回数据的字符集
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
字符集的设置
可以在my.cnf中设置:
[mysqld]
default-character-set=gbk
或者在启动选项中指定:
mysqld --default-character-set=gbk
或者在编译的时候指定:
./configure --with-charset=gbk
原理解析:
MySQL存储数据的唯一地方就是列,所以继承的较高层次只有默认值。表的默认字符集不会影响到表里面存储的数据,它只是告诉MySQL在创建列的时候如果没有指定字符集,那么就使用该默认值
在显式地定义字符集的时候,并不需要同时定义字符集和排序规则。
只有基于字符的值才有字符集
其他的任何东西都只是规定使用何种字符集来进行比较或其他操作
基于字符的值可以是存储在列中的值、查询中使用的字面常量、表达式的结果、用户变量等。
MySQL的设置分为下面两类:
当创建一个数据库的时候,它从服务器继承了character_set_server
当创建表的时候,它从数据库继承字符集
当创建列的时候,它从表继承字符集
使用set names命令,set names实际上就是同时设置了 character_set_client ,character_set_connection和 character_set_results
或者set character set命令按照自己的需要改变上面的3个设置。
但是,这两个命令只会影响服务器的设置。客户端程序和API也需要正确地进行设置,以避免和服务器的沟通问题
注意:
character_set_database的默认值是默认数据库的值。当改变默认数据库的时候,它也会跟着改变。如果没有默认数据库,它的默认值就是character_set_server
LOAD DATA INFILE按照当前character_set_database的设置解释接收到的数据。