mysql变量指定字符集_Mysql中各种与字符编码集(character_t)有关的变量含义

更新时间:2023-07-07 17:28:42 阅读: 评论:0

mysql变量指定字符集_Mysql中各种与字符编码集
(character_t)有关的变量含义
mysql涉及到各种字符集,在此做⼀个总结。
字符集的设置是通过环境变量来设置的,环境变量和linux中的环境变量是⼀个意思。mysql的环境变量分为两种:ssion和global。ssion变量是仅在这次会话红中有效,在mysql中,⼀次会话可以理解为当前连接(除⾮reload,否则,⼀次会话就只有⼀次连接)。global 环境变量则是确定了下⼀个新建⽴的ssion的变量值。使⽤show variables可以查看ssion值,如果要查看global的环境变量,则⽤show golbal variables语句。设置ssion环境变量⽤t variablename=value,设置global环境变量⽤t global
variablename=value。
环境变量可以在服务启动后⽤t来设置,有些(主要是和数据库服务器有关的)也可以在启动服务时⽤命令⾏参数指定,还可以在配置⽂件中设置(myf)。
2016年12月mysql提供了四个等级的默认字符集以及⽐较规则,分别是服务器、数据库、表、列级别的。⽂档原话是:There are default ttings
for character ts and collations at four levels: rver, databa, table, and column. The description in the following ctions may appear complex, but it has been found in practice that multiple-level defaulting leads to natural and obvious results.
⼀个字符集(character t)对应了⼀个默认的字符排序码规则(collation),当改变了⼀个等级的默认编码集时,与它同等级的默认字符排序规则也会变成该字符集对应的字符排序规则。
除了有这四个等级的默认字符编码和排序规则,还可以指定具体某⼀段字符的编码以及他的排序规则,指定字符编码是直接在他前⾯加上
_utf8就可以了,指定排序规则在后⾯加上collate,如下这样: SELECT _utf8'abc' COLLATE utf8_danish_ci; 注意,如果有转义字符,那么转义字符是不会收字符串指定编码集影像的,⽽是和character_t_connection⼀致,如下:
1 mysql> SETNAMES latin1;
2 mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');
返回的结果中\n仍然是换⾏符,因为\⽤的是latin1的字符集,在latin1中,它是换⾏符,⽽_sijis字符集中,\不是转移字符,⽽是6E。
结果:
+------------+-----------------+
| HEX('à\n') | HEX(_sjis'à\n') |
+------------+-----------------+
留守儿童英语| E00A | E00A |
+------------+-----------------+
如果要查看所有的字符集,⽤show character t语句,查看所有的collation,⽤show collation语句。
字符集的设定不仅影响着存储,还会影响客户端和数据库服务器的通信,关于数据编码,mqsql中涉及到下⾯⼏个问题:
高城刚1、客户端发过来的数据使⽤什么字符集编码的?
2、接收到数据之后,应该⽤什么编码格式编码之后再将数据插⼊到mysql rver中?
3、执⾏查询之后,查询出来的结果应该⽤什么编码集编码之后再返回?
4、数据库的各种表的数据,应该⽤什么字符集编码,以及它们⽤什么排序?
5.查询语句的字符串⽐较时,应该在哪⼀个标准⾥⾯来⽐较,⽐如:'Mueller' = 'Müller'是为真还是假?
6.数据库的各种元数据,包括表名、数据库名、密码、⽤户名、以及comment等,⽤什么字符集表⽰?
针对这四个问题,mysql就提供了不同的环境变量来进⾏跟踪,这些变量为:
变量名
含义
character_t_rver
默认的内部操作字符集
character_t_client
客户端来源数据使⽤的字符集,也就是客户端发过来的查询语句使⽤的什么字符集
character_t_connection
MySQL接受到⽤户查询后,按照character_t_client将其转化为character_t_connection设定的字符集。
character_t_results
查询结果编码的字符集
character_t_databa
当前选中数据库的默认字符集
character_t_system至死不渝的意思
系统元数据(字段名等)字符集
collation_connectionlook for
执⾏字符⽐较时采⽤的编码规则
在mysql中,可以为数据库指定默认的字符编码,成为该数据库中每个新建表的默认字符编码集,但是对于已经建⽴的表则不受影响。在新建⼀个表时,也可以使⽤DEFUALT CHARACTER SET=xxx来指定表的字符编码。
在数据库的查询(lect update inrt)操作中,涉及到的字符编码有character_t_client, character_t_connnection,
character_t_result三个变量,这是三个变量是需要建⽴连接之后进⾏设置的.
1、针对第⼀个问题,使⽤character_t_client环境变量来回答:
character_t_client ,这是⽤户告诉服务器,客户端发过来的SQL语句是⽤的什么字符集,要和客户端发出去的字节流采⽤的编码集⼀致,如果是shell,那么就是和shell的编码集⼀致,中⽂windows的cmd就是gbk。但是对于使⽤_utf8'xxx'标记的字符,则⽤标记的字符集解码。
剧院的英文2、针对第⼆个问题,使⽤character_t_connetion环境变量来回答:
character_t_connection ,MySQL rver 接收到⽤户查询后,按照character_t_client将其转化为character_t_connection设定的字符集,⼀般就是所操作的表对应的编码集。
3、针对第三个问题,使⽤character_t_result环境变量来回答:character_t_results , MySQL将存储的数据转换成
character_t_results中设定的字符集发送给⽤户,客户端获取到的结果就是以这种形式编码的。
4.针对第四个问题,使⽤上⾯提到的四个等级的默认字符集以及排序规则,即character_t_rver、character_t_databa以及建⽴表时的DEFAULT CHARACTER SET=xxx和指定字段时的DEFAULT CHARACTER SET=xxx来回答:
character_t_rver决定了服务器的默认编码,character_t_databa决定了新建数据库的默认字符集,⽽数据库的字符集⼜决定了新建表的默认字符集,⽽表的字符集⼜决定了字段的默认字符集,如果没有通过DEFAULT CHARACTER SET=xxx来改变表的字符集,则新表就使⽤character_t_databa指定的字符集。
5.针对第五个问题,使⽤collation_connection来回答:
collation_connection变量制定了⽐较的规则。collation_connection的值得形式如下:字符集_语⾔_ci(⼤⼩不写敏感) 或字符集_语⾔
_cs(⼤⼩写敏感),像中⽂这样的,没有⼤⼩写,所以只能是ci,⽐如t collatioin_connection=gbk_c
hine_ci。就是设置成中⽂字典的排序规则。除了按具体语⾔排序,还可以按照⼆进制的位置排序,⽐如utf8_bin。
character_t_connection和collatioin_connection是⼀体的,设置了character_t_connection之后,collation_connection会跟着变成对应的默认排序规则,反之亦然。如果要显⽰的设置排序规则,可以⽤ SET NAMES 'chart_name' COLLATE 'collation_name'colton
但是如果查询语句的字符串和表的字段⽐较,则collation_connection不适⽤,因为表的字段有它⾃⼰的字符排序规则,⽽它⾃⼰的排序规则优先级⾼于collation_connection。
6.针对第六个问题,使⽤character_t_system来回答:
character_t_system表⽰元数据的字符集,默认就是utf8,⽽且不要去更改它,否则,因为类似于⽤户名密码这种东西,可能⽤各种奇葩的字符去表⽰,只有utf8能够容纳它们。如果变成了别的字符集,那么⽤户名和密码就不能⽤你想要的字符去表⽰了。需要注意的是,这个character_t_system也好,character_t_dababa、character_t_rver也好,都指标是在数据库内部的保存格式,⽽不是返回到客户端的编码格式,返回到客户端的结果都会转化为character_t_results指定的字符集
之后再返回,官⽅⽂档原话是“Storage of metadata using Unicode does not mean that the rver returns headers of columns and the results of DESCRIBE functions in the character_t_system character t by default. When you u SELECT column1 FROM t, the name column1 itlf is returned from the rver to the client in the character t determined by the value of the character_t_results system variable, which has a default value of latin1.”。
另外,如果要临时设置返回值的编码,可以⽤t names  chart_name'来临时改变character_t_results以及其他相关变量的值为chart_name。t names  'chart_name'等价于下⾯三条语句的结合:
1 SET character_t_client =chart_name;
2 SET character_t_results =chart_name;
3 SET character_t_connection = chart_name;
vitamin water1 SET character_t_client =chart_name;
伏地2 SET character_t_results =chart_name;
3 SET collation_connection =
@@collation_databa;
所以,t character t 'chart_name'要更常⽤。
顺便提⼀句,mysql的错误⽇志意识utf8格式产⽣的,但是如果把它输出到客户端,它就会转场character_t_results的编码格式再传到客户端(所有传到客户端的东西都会转码成character_t_results的)。
还可以加⼊启动参数skip-character-t-client-handshake来使客户端的编码和数据库保持⼀致。cloud是什么意思
通常,客户端的字符集可以通过操作系统来获取,从⽽使得字符集的分配和客户端⼀致。

本文发布于:2023-07-07 17:28:42,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1083985.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字符集   编码   默认   客户端   字符
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图