mysql 设置字符集排序规则(不为人知的mysql字符集设置)
如何修改mysql数据库的未知MySQL字符集
概述
最近在项目组使用的mysql数据库中,插入的数据出现了乱码。本文对这一问题进行了。在这里,我们从最基本的地方开始,到错误的深层次原因和解决 。01
基本概念
字符是指人类语言中最小的表意符号。比如 A B ;等。给定一系列字符,给每个字符一个数值,对应的字符用数值表示,这就是字符的编码。例如,如果我们给字符 A 字符 的值为1。B ;则0是字符 a
给定一系列字符和相应的代码,所有这些字符和代码对的 就是一个字符集。例如,给定一个字符列表{ a 和 b }、{ a =0和 b =1}是一个字符集;
归类是指同一字符集中字符之间的比较规则;
确定字符顺序后,什么是等价字符,字符之间的大小关系可以在一个字符集上定义;
每个字符序列唯一对应一个字符集,一个字符集可以对应多个字符序列,其中一个是默认的归类;
MySQL中的端序名称遵循命名约定以对应端序的字符集名称开头;以_ci(不区分大小写)、_cs(区分大小写)或_bin(按编码值比较)结尾。例如,在字符序列 utf8 _ general _ ci ,人物 a 和 a 是等价的;
02
MySQL字符集六脉神剑
MySQL服务器中有六个关键位置使用了字符集的概念,分别是客户端、连接、数据库、结果、服务器和系统。MySQL有两个字符集的概念一个是字符集本身,一个是字符集检查规则。字符集影响数据在传输和存储过程中的处理方式,字符集校验影响ORDER BY和GROUP BY的排序方式。1、系统变量
character _ set _ server:默认内部操作字符集。
character _ set _ client:客户端源数据使用的字符集。
character _ set _ connection:连接层字符集。
character _ set _ results:查询结果字符集。
character _ set _ database:当前所选数据库的默认字符集。
character _ set _ system:系统元数据(字段名称等)的字符集。).
还有以collation_开头的对应于上述内容的变量,用于描述字符顺序。
2、用introducer指定文本字符串的字符集
格式[_ charset] ;弦与弦。[排序关系]
例如
SELECT _ latin1 stringSelect _ utf8 你好 整理utf8 _ general _ ci由introducer修饰的文本字符串直接转换为内部字符集,无需在请求过程中进行不必要的代码转换。
服务器字符集(@@character_set_server)库字符集(@@character_set_database)
表格字符集
字段字符集
在服务器安装期间指定的默认字符集。
Character_set_database:数据库服务器中的库所使用的字符集,如果在构建数据库时没有指定,将会被使用。
Character _ system:数据库系统使用的字符集。
创建表时,只要不是二进制的,每个字段都会有一个字符集。如果你不 t指定它,则在显示CREATE TABLE时不会显示它。
构建表格时,字段字符集选择如下
if字段中指定的字符集 else if表中指定的字符集 else if @ @ Character _ set _ database else @ @ Character _ set _ server(如果未设置,此值为Latin 1)
03
和存储有关的
010 @ @ Character _ set _ connection。@@character_set_results
@ @ character _ set _客户端
Character_set_connection:设置连接数据库的字符集类型,如果php没有的话。
指明连接数据库使用的字符集类型就按照服务器端默认的字符设置character_set_results: 数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集
character_set_client: 客户端使用的字符集,相当于网页中的字符集设置
05
字符集的校对规则
字符集的校对规则设定分别由上面的character_set_connection, character_set_database, character_set_server决定
collation_connection: 连接字符集的校对规则
collation_database: 默认数据库使用的校对规则。当默认数据库改变时服务器则设置该变量。如果没有默认数据库,变量的值同collation_server
collation_server: 服务器的默认校对规则
以上内容中character_set_client, character_set_connection, character_set_results 受客户端默认字符集影响,其中php编译mysql模块时的默认字符集同样也受到它链接的mysql动态库影响,从而影响到php的character_set_connection, character_set_client设定。当默认字符集不是utf8时,设置my.cnf
[mysqld]default-character-set=utf8default-collation=utf8_general_ci
default-character-set只能改变对存储层(server,database,table,column,system)的设定,对于客户端和服务器端的通讯层没有任何影响。
mysqlgt SHOW VARIABLES LIKE 'character_set_%'
06
MySQL中的字符集转换过程
1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定 如下
1)使用每个数据字段的CHARACTER SET设定值;
2)若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);
3)若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;
4)若上述值不存在,则使用character_set_server设定值。
3. 将操作结果从内部操作字符集转换为character_set_results。
分析下产生的乱码问题
1、字段没有设置字符集,使用表的数据集
2、表没有指定字符集,默认使用数据库存的字符集
3、数据库在创建的时候没有指定字符集,使用character_set_server设定值
4、没有特意去修改character_set_server的指定字符集,使用mysql默认
5、mysql默认的字符集是latin1,,我们使用了latin1字符集,而我们character_set_connection的字符集是UTF-8,插入中文乱码也再所难免了。
, 在创建database的时候指定字符集,不要去通过修改默认配置来达到目的,你也可以采用指定表的字符集的形式,但很容易出现遗漏,特别是在很多人都参与设计的时候,更容易纰漏。
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~
mysql设置字符集utf-8 mysql对已创建表设置字符集