最近遇到一个很棘手的问题,从一个较早创建的Mysql数据库中导出数据,并且要对数据表结构进行改造,发现导出的数据内容中的中文全部是乱码,由于服务器管理人员限制,用phpmyadmin无法查看原数据库内容,无法得知数据库中的内容是否乱码,但可以看到数据库和数据表的字符集均为Latin1_swedish_ci,是拉丁字符集,由于公司内部有专门的导出数据的脚本,所以导出数据时一直使用的都是这个脚本,只需要修改数据库的连接信息就可以,但不管怎么导出都是乱码。
后来在经理的指点下修改了脚本中连接字符集的编码为Latin1,再导出的数据内容中文字符就正常显示了。查阅资料得知,数据库中字符集的编码并不只是包括数据库和数据表,还有客户端、服务器端、连接字符集,而导出数据的脚本是逐行读取然后写入sql文件的,由于脚本默认的字符集是gbk,而数据库的连接的字符集是Latin1,二者编码不一致导致导出的中文为乱码,只要在导出数据时将字符集设置为同数据库连接字符集一致就可以解决问题。
以上的问题也提醒了我们在创建数据库时要兼顾到程序代码使用的是什么编码,正确的设置数据库、数据表、连接字符集的编码,为之后数据的迁移、数据库结构的调整减少不必要的麻烦。
以下是查看字符集和排序方式的命令,用phpmyadmin可以直接用sql方式运行myql>之后的命令:
mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | latin1 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
7 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE ‘collation_%’;
+———————-+——————-+
| Variable_name | Value |
+———————-+——————-+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+———————-+——————-+
3 rows in set (0.00 sec)