【他山之石】mysql编码问题总结
有些问题可能比较基础,但是没有经过系统学习还是可能会出错,记录下。
这次是mysql的编码问题。
背景是部署新的测试环境,给了一台服务器还有在另一个环境下的mysql,配置过程中发现mysql编码有问题,查看结果如下
发现character_set_client和character_set_connection以及character_set_results都是latin1(也就是iso-8859-1),这显然不行。于是想到修改数据库服务器上的my.cnf文件,在[client]下增加了一行
default-character-set=utf8
发现还是不行,一直不理解问题出在哪里,后来才发现自己的愚蠢,问题不是出在mysql服务端的配置,而是客户端的配置。
比如执行 mysql -h test-db.com -u test -p的时候,决定此次连接的编码的一方是当前mysql客户端的配置文件my.cnf而不是mysql数据库服务端的配置文件!!!
这次经过修改之后终于正常了。之前还找过dba的同事,感觉脸火辣辣的,这酸爽╮(╯_╰)╭
顺便回顾下各个属性的意义吧。
1 character_set_client: MySQL服务器假定client传输过来的数据的编码.(客户端决定) 2 character_set_connection: MySQL服务器接收到数据时,将其转换成哪种编码.(客户端决定) 3 character_set_results: MySQL服务器响应给客户端的数据采用哪种编码.(客户端决定) 4 character_set_system: 元数据采用的编码(表名, 列名等). 5 character_set_server: MySQL服务器默认的数据编码方式. 6 character_set_database: MySQL数据库默认的数据编码方式. 7 character_set_table: MySQL数据库中表的默认数据编码方式. 8 character_set_column: MySQL数据库中表的列(字段)默认的数据编码方式.
MySQL默认的"服务器/数据库/表/列"的编码方式,优先级由低到高, 表的编码方式可覆盖数据库的编码方式,列(字段)的编码方式可覆盖表的编码方式.
MySQL配置文件中的"default-character-set=utf8"相当于"set names utf8".
MySQL在执行操作前,先把接收到的数据从character_set_client转换为character_set_connection,
然后再把character_set_connection转换为与内部数据库相匹配的字符集,
最后执行完操作后,再把返回的结果转换为character_set_results.