mysql字符集问题

字符集由字符和编码组成,如字符ABab对应编码1234及组成一个字符集(show character set 可查看mysql支持的字符集),字符校对规则则是“对编码进行比较”的一套规则。如排列时不区分大小写,即A=a,或者德语的不区分重音和轻音。一个字符集对应一个或多个校对规则,但一个校对规则不可对应两个字符集。如latin1的校对规则有latin1_german1_ci latin1_swedish_ci(可用show collation like 'lation'查看)等其默认校对规则是latin_swedish_ci。_ci表示对大小写不敏感、_cs大小写敏感_bin二元。

myini配置文件的默认服务器编码和校对规则为
collation_server=utf8_unicode_ci
character_set_server=utf8

在创建数据库是如无特殊指定数据库字符集character_set_database默认为配置配置文件character_set_server服务器编码模式。
在创建表时,如无指定表的编码字符集默认为数据库编码字符集character_set_database,同理,字段默认继承表的字符编码集。
在数据库的查询工作流程
客户端->连接器->服务器
服务器->连接器->返回值
这涉及到三个变量
character_set_client
character_set_connection
character_set_result

这三个变量值一致才会不出现乱码,也就是我们说的三码合一,可以通过 set names utf8 设置。

另外可以通过修改配置表my.ini在[mysqld]下添加

init-connect="SET NAMES utf8"

就可以实现默认连接设置 SET NAMES utf8,字符设置问题就解决了。(注:init-connec后的语句为非超级用户才能执行,这样防使得即时后面跟的语句错误时,超级用户root仍能使用mysql服务器进行修改操作)



例如 假设column1定义为CHAR(5) CHARACTER SET latin2。如果没有设定SET NAMES或SET CHARACTER SET,那么对于SELECT column1 FROM t,当连接后,服务器使用客户端指定的字符集返回列column1的所有值。另一方面,如果你设定SET NAMES 'latin1'或SET CHARACTER SET latin1,那么发送结果之前,服务器转换latin2值到latin1。转换可能会丢失那些不属于两种字符集的字符。


另附

查询数据库的具体各个变量的编码
show variables like " character_set_%";
更改数据库的编码
alter database dbname character set utf8;
更改character_set_client和character_set_result的编码模式
set character set utf8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值