今天在V2EX上问了下遇到的mysql数据库中文乱码的问题,先说下,V2EX比CSDN论坛的模块好多了,一个小时的点击量就突破了500次,而且也有很多人帮助回答。
然后下面是我问的问题:
---------------------------------------------------------
项目全程都是utf8,hibernte写进数据库的数据取出来在myeclipse的consle下面显示是正常的,为何在数据库那个dos窗口下面显示的中文名就是乱码。注明:我的数据库所有配置都是utf8
然后我又试着手动在dos窗口下用insert语句插入中文,结果是error1406,插不进去,再查看用程序插进去的中文显示乱码。
之后的解决方法:我把my.ini文件中的两处配置改为GBK,然后dos窗口下显示出了正确的中文,我想问的是既然数据库是utf8编码,为何GBK可以把中文读出来,utf8就不行,是不是dos窗口中不支持utf8的显示,所以中文乱码?
----------------------------------------------------------
想了一下,差不多应该就是DOS窗口的显示问题了,现在用数据库就用图形化来管理操作了,如果要用命令提示符操作的话,就只能先set names gbk;然后不用了就输入一句set names utf8;之所以这么切换是因为我想保持所有的都为utf8方式,避免可能出现的麻烦,这应该就是目前的解决办法吧。
MySQL命令行输入“SET NAMES UTF8;”
面那句等于:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8
mysql中的运行模式为
信息输入路径:client→connection→server;
信息输出路径:server→connection→results。
换句话说,以出现乱码的输出为例,server里utf8的数据,传入connection,传入results依旧为utf8,dos窗口把results转过来。如果两种字符集不兼容,比如gbk和utf8,转化过程就为不可逆的,破坏性的,所以会出线乱码。
再来看不出现乱码的情况,每个路径要经过3次改变字符集编码。server里utf8的数据,传入connection转为gbk,传入results,编码方式依旧为GBK,DOS窗口把results转过来,dos默认是GBK编码方式,这就是相同的了,就不会出现乱码。
所以我之前总是error1406,插入不进包含中文的sql语句,也就是这个道理。
另外,我的数据库编码方式,我在创建的时候就设定为了utf8了,所以我的数据库的编码方式为utf8,那么我其他的工具读取的时候就不会有错。
这就是为什么每次一乱码,输入一句set names gbk(对于dos窗口),或者输入一句set names utf8(对于页面等以utf8编码的东西),乱码就消失了的原因吧。
当然了set names GBK;关掉数据库再重启的话就有恢复成原来的了,不过这也无所谓了,以后差不多都用图形化的管理工具了吧,也不太会用到dos窗口,等自己以后的技术成熟了,有了几年的经验以后,就用linux的开发环境吧。
----------------------------------------------------------------------------------
今天学到关于数据库的其他知识:
查看当前数据库编码格式:
show variables like ‘character_set_database‘;
查看字符编码
show variables like ‘character%‘;
设置服务器的编码方式
set character_set_server=utf8
varchar和nvarchar的区别在于varchar是character字符nvarchar是Unicode字符串,前者不支持中文,后者支持中文
mysql中schema的具体意思
http://blog.csdn.net/kimsoft/article/details/4627520
mysql的1406错误就是由于上述的编码方式不一样造成的。