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。
我们现在回过头来分析下我们产生的乱码问题:
a 我们的字段没有设置字符集,因此使用表的数据集
b 我们的表没有指定字符集,默认使用数据库存的字符集
c 我们的数据库在创建的时候没有指定字符集,因此使用character_set_server设定值
d 我们没有特意去修改character_set_server的指定字符集,因此使用mysql默认
e mysql默认的字符集是latin1,因此,我们使用了latin1字符集,而我们character_set_connectio
n的字符集是UTF-8,插入中文乱码也再所难免了。
检测字符集问题的一些手段
• SHOW CHARACTER SET;
• SHOW COLLATION;
• SHOW VARIABLES LIKE ‘character%’;
• SHOW VARIABLES LIKE ‘collation%’;
• SQL函数HEX、LENGTH、CHAR_LENGTH
• SQL函数CHARSET、COLLATION
设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,存入数据库的仍然是乱码。那con
nection连接层上可能出了问题。解决方法是在发送查询前执行一下下面这句: SET NAMES 'utf8';
它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;