php弹出网页窗口mysql连接字符集_MySQL字符集详解
⼀、MySQL字符集编码简单介绍
在使⽤MySQL时要注意6个需要编码的地⽅:系统的编码、客户端、服务端、库、表、列。字符集编码不仅影响数据存储,还影响client程序和数据库之间的交互.在mysql中输⼊命令show session variables like '%char%'能够看到例如以下⼀些字符集(下⾯是以win10为例,⽣产中多数时linux,在linux⾥⾯除了latin1之外都是utf8的字符集):
mysql> show variables like "%char%";
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | gbk |stata中scalar
| character_set_connection | gbk |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | F:\jj\mysql-5.6.42-winx64\share\charsets\ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)
mysql无法连接到服务器mysql中的字符集都相应着⼀个默认的校对规则(COLLATION),当然⼀个字符集也可能相应多个校对规则,可是两个不同的字符集不能相应同⼀个规则。使⽤默认的就可以了
以下来看看上⾯命令列出的字符集相关变量的含义:
character_set_client:server解析客户端sql语句的字符集.(The character set for statements that arrive from the client. The session value of this variable is set using the character set requested by the client when the client connects to the server).
学理发视频 新手character_set_connection:字符串字⾯值(literal strings)的字符集.
character_set_results:server返回给客户端的查询结果或者错误提⽰的字符集编码.(The character set used for returning query results such as result sets or error messages to the client)
character_set_system:这是mysqlserver⽤来存储元数据的编码,通常就是utf8,不要去改动它.
character_sets_dir:这是mysql字符集编码存储⽂件夹.
character_set_filesystem:这是⽂件系统字符集编码,主要⽤于解析⽤于⽂件名称的字符串字⾯值,如LOAD DATA INFILE和SELECT ...INTO OUTFILE等语句以及LOAD_FILE()函数.在打开⽂件之前,⽂件名称会从character_set_client转换为character_set_filesystem指定的编码.默认值为binary,也就是说不会进⾏转换.⽐如我们设置的character_set_client=GBK,⽽character_set_filesystem为默认值的话,则采⽤INTO OUTFILE "⽂件名称",⽂件名称为GBK编码.反之,假设我们设置了character_set_filesystem=UTF8,则导出的⽂件名称为UTF8编码. ⽐如:linux系统的终端编码是UTF8,系统默认语⾔和编码为zh_CN.UTF8.我们有⼀个数据库名为test,test中有个表名为
t1,编码为latin1,另外,我们在mysqlclient运⾏了SET NAMES GBK,假设我们不改动character_set_filesystem的值,运⾏SELECT * FROM t1 INTO OUTFILE '⽂件1', 能够发现相应的⽂件夹以下⽣成了⼀个名为"⽂件1"的⽂件,那⽂件名称编码是什么呢?事实上这⾥有⼏个地⽅须要注意,⾸先,我们的sql语句⾥⾯的"⽂件1"原⽣编码就是终端编码UTF8,也就是'\xe6\x96\x87\xe4\xbb\xb61',⽽导出数据的语句SELECT * FROM t1 INTO OUTFILE '⽂件1',依照前⾯的说法,由于character_set_filesystem为binary,因
此'\xe6\x96\x87\xe4\xbb\xb61'不会转换,这样终于还是'\xe6\x96\x87\xe4\xbb\xb61',这样在zh_CN.UTF8的系统中⽂件名称不会乱码.⽽假设我们设置了character_set_filesystem=UTF8,则原⽣的'\xe6\x96\x87\xe4\xbb\xb61'会先依照GBK解码,然后⽤UTF8编码,最后的结果是"\xe9\x8f\x82\xe5\x9b\xa6\xe6\xac\xa21",这样⽂件名称就会乱码了.所以这个变量也最好不要改动,⽤默认值就OK.
character_set_server:服务器默认字符集编码,假设创建数据库的时候没有指定编码,则采⽤character_set_server指定编码.
character_set_database:默认数据库的字符集编码.假设没有默认数据库,则该变量值与character_set_server同样.事实上这个值代表的就是你当前数据库的编码⽽已,⽐⽅使⽤"use test",⽽te
st数据库的编码为latin1的话,这个值就是latin1.⽽你切换的时候"use test2",则character_set_database的值就是数据库test2的编码.
⼆、MySQL字符集编码层次androidsdk安装步骤
第⼀部分主要是归纳了MySQL⽂档中关于字符集编码的说明。这部分主要说明下MySQL中字符集编码层次:服务端-->数据库-->表-->字段。
关于系统的编码主要针对的是我们将来在存储⽂件的时候,有可能会将⽂件直接存贮在mysql的服务器上,那么,我们在数据库⾥⾯存的就是这些⽂件的路径,实际⽂件是存在系统⾥⾯的,那么⽂件名称就会受到你系统编码的影响,⽐如我们mysql设置的utf8编码的格式存储的⽂件路径,但是系统默认是gbk编码的,那么⽂件在保存到系统⾥的时候,⽂件的名称和你存在mysql⾥⾯的⽂件名称就对应不上了,出现乱码显⽰的问题,所以也要注意系统的编码。客户端的编码问题,我们在第⼀节的时候说了⼀下,⼤家应该⽐较了解啦。所以我们下⾯之说mysql内部设置的这些编码问题。
简单来说,服务器编码就是character_set_server来指定的.当我们创建数据库的时候能够指定编码,假设没有指定,采⽤的就是
character_set_server指定的编码.⽐如:我们使⽤"create database t1 character set gbk",这⾥我们指
定了数据库t1的编码为gbk,所以不会采⽤character_set_server指定的编码.⽽假设我们使⽤"create database t2",则通过"show create database t2"能够看到t2的编码为character_set_server定的编码.
同理,mysql表也能够有⾃⼰独⽴的编码,在创建表的时候能够指定,假设没有指定,则默认采⽤数据库的编码.⽐⽅我们再之前的数据库t1创建表t11,"create table t11(i int) character set utf8",则表t11的编码为utf8,假设不指定编码则编码为数据库t1的编码gbk.
此外,mysql表中的字段也能够有⾃⼰的编码,假设不指定字段编码,则字段编码与表的编码⼀致.
三、MySQL连接字符集
前⾯谈到的编码内容基本都不会产⽣乱码问题,mysql中容易产⽣乱码的地⽅在character_set_client, character_set_connection, character_set_results这三个变量的设定.能够简单的通过set names utf8或者charset utf8命令来⼀次设置这三个參数.
从⽂档中的解释来看,mysql连接字符集转换主要包含以下三个步骤:
z姓女明星的名字1.character_set_client是client发送过来的sql语句的编码,由于服务端本⾝并不知道client的sql语句的编码是什么,所以是以这个变量作为clientsql语句的初始编码.⽽服务端接收到sql语句后,则会将sql语句转换为character_set_connection指定的编码(注意,对于字⾯值字符串,假设前⾯有introducer标记
如latin1或utf8,则不会进⾏这⼀步转换).转换完毕,才会真正运⾏sql语句.
2.进⾏内部操作前将sql语句中的数据从character_set_connection转换为数据表中对应字段的编码.
3.将操作结果从内部字符集编码转换为character_set_results编码.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论