mysql字符问题

Character_set_server=gbk, default-character-set=gbk


Character_set_server=utf8, default-character-set=gbk


Character_set_server=gbk, default-character-set=utf8(client,connection,results跟随default设置)


Character_set_server=utf8, default-character-set=utf8


上面展示了四种不同设置,mysql字符集的情况。


事实上,mysql的每个字符集项都是起到不同的作用的:

MySQL字符集设置
• 系统变量:
– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集 


下图展示了mysql字符集解码编码的整个过程:


将客户端发来的sql以character_set_client的编码方式解码,之后按照character_set_connection编码方式转码,此时sql的编码已经跟character_set_connection的编码相同了,再将sql的编码根据将要插入的数据库(数据库表,数据库表的字段)所设置的编码进行转码后存入表中。

而在查询数据的时候,将数据库表中的数据按照内部操作字符集(数据库的字符集)进行解码,然后转码成character_set_results编码,最后发送给客户端。

这还只是数据库方面的字符编码解码情况,开发中还会存在,前端到后端的编码转码,后端代码跟数据库之间的编码解码,所以开发中如果遇到乱码问题,就需要考虑到每个环节是否按照正确的字符集进行解码和编码。

常常发生的问题是:原本sql编码方式明明是gbk,但是却按照utf8编码方式解码(后台代码到character_set_client环节),之后又将错误解码的数据按照character_set_connection设置的编码方式进行编码又得到了错误的编码数据,再往后的数据都会发生错误。不过有些时候虽然这个编解码过程发生错误,但页面仍然显示正确,是由于错误编码后,又用错误的解码方式解码,最后二进制数据还原到存入数据库之前的二进制序列。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值