解决MySQL显示中文的问题

第一次用MySQL,被中文显示的问题折腾了半天,还好终于解决了,将过程记录下来。

首先要找到配置文件my.ini,在百度查了说这个文件在安装的目录,结果我的Mysql目录下并没有my.ini,只有一个my-default.ini,这个my-default.ini什么也没设定,还在注释中说不要更改它,并且说“It's a template which will be copied to the default location during install"。所以我想应该是有一个真正的my.ini的,结果上google一查,查到了这个网站:

http://stackoverflow.com/questions/14597884/mysql-my-ini-location
里面说5.6版的MYSQL已经不把my.ini放在安装目录下了。在查找my.ini时,mysql优先查找这个路径: %PROGRAMDATA%\MySQL\MySQL Server 5.6\my.ini。我的mysql是5.7,看来也很可能是这种情况。
通过echo %PROGRAMDATA%命令得知我的系统里这 个变量是 C:\ProgramData,于是顺着路径终于找到了my.ini。

然后是配置字符编码。查了半天,最后得到的有用的信息如下:
一、查看系统使用字符集的情况的方法
进入mysql系统后,输入show variables like 'character%'命令即可,如:
解决MySQL显示中文的问题_第1张图片

二、字符集转换过程(来自 http://www.cnblogs.com/discuss/articles/1862248.html ):

1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:
       - 使用每个数据字段的CHARACTER SET设定值;
       - 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);
       - 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;
       - 若上述值不存在,则使用character_set_server设定值。

3. 将操作结果从内部操作字符集转换为character_set_results。


三、设定各个字符集相关变量的方法
1.  character_set_system是只读的,不能改(结果证明不需要改也可以显示中文)。
2. 在my.ini中找到 default_character_set和 character_set_server,可对其进行设定
3.  sql语句:set names 字符集(如gbk/utf8),会同时设定character_set_client,character_set_connection,character_set_results
4. sql语句:set 字符集变量(如character_set_client)=字符集,可设定特定字符集变量(除了character_set_system)

四、在my.ini的这句话 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"中去掉STRICT_TRANS_TABLES,可以解决data too long for column 的那个错误,允许插入了,但是显示出的仍是乱码,有warnings。

五、show warnings可以显示warnings的内容,找到问题所在。

就算查了一堆,对字符集变量的调整仍然折腾了半天:
首先我通过set names utf8和把my.ini的default_character_set和character_set_server都设成utf8,这时用show variables like 'character%'查看,除了那个binary其它都是utf8。结果拿插中文的sql文件一试,确实没有warning了,但显示出的仍是乱码。
查了网上说是因为dos不支持utf8。于是我又通过set names 和更改my.ini把能改的都改成gbk,结果还是显示乱码,并且有warning: invalid gbk character string xx。
然后想了半天,觉得有可能是因为我是在sublime text写的sql文件,然后那里面的字符都是utf-8编码的,而在字符集转换过程的第一步“
MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;”中又直接将其视为gbk,就出了错。于是,我将能改的又都改成utf8,然后将character_set_results专门设成gbk,结果终于成功了:

解决MySQL显示中文的问题_第2张图片

你可能感兴趣的:(数据库)