mysql分片集群
接下来的一些列文章会为大家介绍日常工作中常用的 NoSQL 产品 MongoDB。主要涉及到:MongoDB 的安装及基本使用MongoDB 文档查询MongoDB 复制集MongoDB 分片集群的介...
2024.11.15最近,在项目组使用的mysql数据库中,插入数据出现乱码,关于这个问题做了下总结,这里我们从最基本的地方说起,到错误产生的深层次原因和解决办法。
01基本概念• 字符(Character)是指人类语言中最小的表义符号。例如’A‘、’B‘等;
• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A‘赋予数值0,给字符’B‘赋予数值1,则0就是字符’A‘的编码;
• 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{’A‘,’B‘}时,{’A‘=>0, ‘B’=>1}就是一个字符集;
• 字符序(Collation)是指在同一字符集内字符之间的比较规则;
• 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;
• 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation);
• MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;
02MySQL字符集六脉神剑MySQL服务器中有六个关键位置使用了字符集的概念,他们是:client 、connection、database、results、server 、system。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] ’string’ [COLLATE collation]
– 例如:
select _latin1 ’string’; select _utf8 ‘你好’ COLLATE utf8_general_ci;– 由introducer修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。
03和存储有关的服务器字符集 (@@character_set_server)
库字符集 (@@character_set_database)
表字符集
字段字符集
character_set_server: 服务器安装时指定的默认字符集设定。
character_set_database: 数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
character_system: 数据库系统使用的字符集设定。
在创建一个表的时候,每个字段只要不是binary,都会有一个字符集。如果不指定,那么在SHOW CREATE TABLE的时候,它是不会显示出来的。
建表时候,字段字符集的选取方式如下:
* if 字段指定的字符集* else if 表指定的字符集* else if @@character_set_database* else @@character_set_server (如果没有设定,这个值为latin1)04和传输有关的@@character_set_connection
@@character_set_results
@@character_set_client
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_cidefault-character-set只能改变对存储层(server,database,table,column,system)的设定,对于客户端和服务器端的通讯层没有任何影响。
mysql> SHOW VARIABLES LIKE ‘character_set_%‘;06MySQL中的字符集转换过程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方面的内容,感兴趣的朋友可以关注一下~
接下来的一些列文章会为大家介绍日常工作中常用的 NoSQL 产品 MongoDB。主要涉及到:MongoDB 的安装及基本使用MongoDB 文档查询MongoDB 复制集MongoDB 分片集群的介...
2024.11.15邮件发送原理telnet命令模拟邮件发送:1、cmd命令下telnet连接上QQ的smtp服务器telnet smtp.163.com 25遇到问题以及解决办法:telnet命令错误控制面板下wind...
2024.11.15服务器字符集和校对规则服务器字符集和校对,在 MySQL 服务启动的时候确定。可以在 my.cnf 中设置: [mysqld] default-character-set=gbk 或者在启动选项中指定...
2024.11.13Mysql 内置了查询字符长度的函数。Length()和char_length()Length(): Mysql里边的length()是一个用来获取字符串长度的内置函数。char_length(): ...
2024.11.13在前面若干章节中,我们介绍了SQL的基础与高阶语法,接下来,我们将分四个章节,介绍MySQL中常见的函数应用,大致分为如下几个章节:MySQL 字符串函数MySQL 数字函数MySQL 日期函数MyS...
2024.11.09