为保持单位电脑和家中电脑上 MySQL 数据同步,需要使用 mysqldump 命令导出数据库 ,但有个问题是导出的 SQL
文件中所有的中文都为乱码。在网上搜索到问题出在字符编码 上。MySQL 有个
--default-character-set=charset_name参数可以 设定字符编码,5.0
手册中有这样一段话:
character set. If no character set is specified, mysqldump uses
utf8, and earlier versions use
latin1.
在MySQL中输入如下命令:
mysql> show variables like '%char%';+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
注意到高亮处显示信息。这表明数据库的字符集为 latin1 格式。从 mysqldump导出的SQL文件也可看出数据库默认编码格式:
CREATE TABLE `motd` (...
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
注意,最后一行自己在创建表格时并没有写,这是mysqldump “默认”添加上去的内容。
而从上面的引用中我们得知:当不加任何参数时,导出的数据的格式为 utf8 格式, 这和数据库的编码(latin1)显然不一致,自然显示为乱码。这和之前在 Debian 上打开 Windows 上使用记事本编辑的文件显示乱码是一个道理。解决方法就是在mysqldump命令后注明需要导出编码为 latin1 的 SQL 文件,命令如下:
mysqldump -u root --default-character-set=latin1 -p trekshot > trekshot.sql
目前已将此命令 alias 至 .bashrc 中。