MySql中SETNAMESutf8详解(乱码原理)_MySQL
不多说,先上图
分析:
set names utf8之前,
character_set_client | gbk
character_set_connection| gbk
character_set_results | gbk
set names utf8之后,
character_set_client | utf8
character_set_connection| utf8
character_set_results | utf8
关于字符集可参照mysql中文手册
地址:http://dev.mysql.com/doc/refman/5.1/zh/charset.html#charset-connection
以下是部分摘录:
在客户端和服务器的连接处理中也涉及了字符集和校对规则变量。每一个客户端有一个连接相关的字符集和校对规则变量。
考虑什么是一个“连接”:它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和校对规则的问题,这些问题均能够通过系统变量来解决:
· 当查询离开客户端后,在查询中使用哪种字符集?
服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。
· 服务器接收到查询后应该转换为哪种字符集?
转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的校对规则优先级。
· 服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?
character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。
你能够调整这些变量的设置,或可以依赖默认值(这样,你可以跳过本章)。
有两个语句影响连接字符集:
SET NAMES 'charset_name'
SET CHARACTERSETcharset_name
SET NAMES 'x'语句与这三个语句等价:
mysql>SETcharacter_set_client = x;
mysql>SETcharacter_set_results = x;
mysql>SETcharacter_set_connection = x;
所以说:
set names utf8指定了客户端和服务器之间传递字符的编码规则为UTF8。
修改MySql默认编码
MySql默认编码是Latin1,不支持中文,要想修改默认编码,需要修改my.ini文件
[client]增加default-character-set=utf8
[mysql]增加default-character-set=utf8
[mysqld]增加
character_set_server=utf8
init_connect='SET NAMES utf8'
cmd下操作mysql乱码需要注意cmd编码
查看当前代码页,如果当前代码页是GBK那么需要set names GBK才可以保证不乱码。
chcp 65001/936修改代码页。完美解决乱码问题。