字符集由字符和编码组成,如字符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
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服务器进行修改操作)
另附
查询数据库的具体各个变量的编码
show variables like " character_set_%";
更改数据库的编码
alter database dbname character set utf8;
更改character_set_client和character_set_result的编码模式
set character set utf8