一、 Mysql 字符集。
• 字符集相关变量:
– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集
其中在解决乱码问题中最关键的三个变量是: character_set_client、 character_set_connection、character_set_results。
character_set_client指定的是Sql语句的编码,如果设置为 binary,mysql就当二进制来处理,character_set_connection指定了mysql 用来运行sql语句的时候使用的编码,也就是说,程序发送给MySQL 的SQL语句,会首先被MySQL从character_set_client指定的编码转换到character_set_connection指定的 编码,如果character_set_clien指定的是binary,则MySQL就会把SQL语句按照 character_set_connection指定的编码解释执行.
当执行SQL语句的过程中,比如向数据库中插入字段的时候,字段也有编码设置,如果字段的编码设置和character_set_connection指定的不同,则MySQL 会把插入的数据转换成字段设定的编码。SQL语句中的条件判断和SQL插入语句的执行过程类似.
当SQL执行完毕像客户端返回数据的时候,会把数据从字段指定的编码转换为character_set_results指定的编码,如果character_set_results=NULL 则不做任何转换动作,(注意这里设置为NULL不等于没有设置,没有设置的时候MySQL会继承全局设置)。 具体过程可参见图1:
图1
二、检测字符集问题的一些手段
• SHOW CHARACTER SET;
• SHOW VARIABLES LIKE 'character%’;
• SHOW VARIABLES LIKE 'collation%’;
• SQL函数HEX、LENGTH、CHAR_LENGTH
• SQL函数CHARSET、COLLATION
使用 mysql> SHOW VARIABLES LIKE 'character%';查看,发现数据库编码均已改成utf8
+--------------------------+---------------------------------+ |
(2) 还有一种修改字符集的方法,就是使用mysql的命令
mysql> SET character_set_client = utf8 ; |
二、 实例。
例:在Mysql执行以文本方式存储的脚本代码,用select 语句查询时发现中文全变成了乱码。
解决方法:把文本文档的存储类型设为utf-8,设置SET character_set_client = utf8 ; character_set_connection = utf8 ; SET character_set_results = gbk ;
再用select语句查询就可以看到中文了。