mysql字符集编码设置与查看命令,Mysql字符集设置

mysql的字符集和字符序:
    字符序:字符序(Collation)是指在同一字符集内字符之间的比较规则
  
 一个字符序唯一对应一种字符集,但一个字符集可以对应各样字符序,其中有一个是私自认同字符序(Default
Collation)

From: 博客园
Johney
近些年,在项目组拔取的mysql数据库中,插入数据出现乱码,关于这么些难点做了下总括,我们从最中央的地点说起,到不当发生的深层次原因息争决办法。

在mysql对字符编码的查看大家选取SHOW VARIABLES LIKE
character即可,修改大家需求修改my.ini中的配置格局了,下边我一起来看看。

字符集难点:

  
 mysql的字符集和字符序有多少个级其他暗许设置:服务器级,数据库级,数据表级,字段级

基本概念

近年,在品种组利用的mysql数据库中,插入数据出现乱码,关于这么些标题做了下统计,大家从最基本的地点说起,到不当暴发的深层次原因和消除办法。

基本概念

  
 mysql中的字符序的命名依照标准,以字符序对应的字符集名称初始.以_ci(大小写不灵活),_cs(大小写敏感)或然_bin(按编码值相比较)
        例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的

• 字符(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”是等价的;

基本概念: • 字符(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”是等价的;
 
MySQL的字符集协助: 1、字符集(Character set)。
2、排序相比艺术(Collation)。

• 字符(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”是等价的;

    mysql字符集设置:
        系统变量:
            – character_set_server:私自认同的中间操作字符集
            – character_set_client:客户端来源数据选取的字符集
            – character_set_connection:连接层字符集
            – character_set_results:查询结果字符集
            – character_set_database:当前当选数据库的专擅认同字符集
            – character_set_system:系统元数据(字段名等)字符集
            – 还有以collation_始发的同地点对应的变量,用来叙述字符序

MySQL字符集设置

因此命令:show character set 和 show collation
能够独家查看Mysql协助的字符集和排序格局。
– mysql> show character set;
– mysql> show collation;
 
Mysql对于字符集的支撑细化到多个层次: 1、服务器(server);
2、数据库(database);
3、数据表(table)(字段column);
4、连接(connection);
  
MySQL字符集变量: mysql字符集编码设置与查看命令,Mysql字符集设置。– character_set_server:暗中认同的其中操作字符集
– character_set_client:客户端来源数据运用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前相中数据库的暗中同意字符集
– character_set_system:系统元数据(字段名等)字符集
– 还有以collation_起来的同地点对应的变量,用来讲述字符序。

MySQL字符集设置

        MySQL中的字符集转换进程:
            1.MySQL
Server收下请求时将呼吁数据从character_set_client转换为character_set_connection
          
 2.展开之中操作前将请求数据从character_set_connection转换为其中操作字符集,其确定方法如下
                   – 使用各种数据字段的CHARACTER SET设定值
                   – 若上述值不存在,则使用相应数据表的DEFAULT CHARACTER
SET设定值(MySQL增添,非SQL标准)
                   – 若上述值不存在,则运用相应数据库的DEFAULT CHARACTER
SET设定值
                   – 若上述值不存在,则利用character_set_server设定值
            3.将操作结果从其中操作字符集转换为character_set_results

• 系统变量:
– character_set_server:默许的其中操作字符集
– character_set_client:客户端来源数据运用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前相中数据库的暗中同意字符集
– character_set_system:系统元数据(字段名等)字符集
– 还有以collation_先导的同地点对应的变量,用来描述字符序。

用introducer指定文本字符串的字符集: 格式为:[_charset] ’string’ [COLLATE collation]
例如:
– SELECT _latin1 ’string’;
– SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;
由introducer修饰的文本字符串在呼吁进度中不通过多余的转码,直接转换为内部字符集处理。

• 系统变量:
– character_set_server:暗许的内部操作字符集
– character_set_client:客户端来源数据利用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前相中数据库的默许字符集
– character_set_system:系统元数据(字段名等)字符集
– 还有以collation_始于的同地点对应的变量,用来讲述字符序。

        检测字符集难题的一声令下;
                SHOW CHARACTER SET;
                SHOW COLLATION;
                SHOW VARIABLES LIKE ‘character%’;
                SHOW VARIABLES LIKE ‘collation%’;
                SQL函数HEX、LENGTH、CHAR_LENGTH
                SQL函数CHARSET、COLLATION

• 用introducer指定文本字符串的字符集:
– 格式为:[_charset] ’string’ [COLLATE collation]
– 例如:
SELECT _latin1 ’string’;
SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;

由introducer修饰的文本字符串在伸手进度中不通过多余的转码,直接转换为内部字符集处理。

1、查看暗中认同字符集(暗许处境下,Mysql的字符集是latin1(ISO_8859_1)
平常,查看系统的字符集和排序方式的设定可以经过下边的两条命令:
 

• 用introducer指定文本字符串的字符集:
– 格式为:[_charset] ’string’ [COLLATE collation]
– 例如:
       SELECT _latin1 ’string’;
       SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;

由introducer修饰的文本字符串在哀告进程中不经过多余的转码,直接转换为其中字符集处理。

        注意事项:
          
 1.my.cnf中的default_character_set设置只影响mysql命令连接服务器时的连日字符集,不会对应用libmysqlclient库
            的应用程序暴发其余功用
          
 2.对字段举办的SQL操作常常都是以中间操作字符集来开展的,不受连接字符集设置的震慑

MySQL中的字符集转换进度

 代码如下

MySQL中的字符集转换进度

        总结:
          
 mysql的字符集可以细化到一个库,一张表,一列.可是一般是应用暗许的安装
              
 1.编译mysql时,指定了一个默许的字符集,这些字符集是latin1
              
 2.装置mysql时,可以在布署文件中指定一个暗许的字符集,假诺没有点名,那么些值继承编译时的字符集
              
 3.起步mysqld时,可以运用character_set_server来指定暗许的字符集,如若没有点名就一连配置文件中的配置
              
 4.设置mysql时选用多语言支持,在程序安装时会自动将安排安装为UTF-8

  1. MySQL
    Server收到请求时将呼吁数据从character_set_client转换为character_set_connection;
  2. 展开之中操作前将呼吁数据从character_set_connection转换为内部操作字符集,其规定方法如下:
    • 动用种种数据字段的CHARACTER SET设定值;
    • 若上述值不设有,则使用相应数据表的DEFAULT CHARACTER
      SET设定值(MySQL增添,非SQL标准);
    • 若上述值不设有,则运用相应数据库的DEFAULT CHARACTER SET设定值;
    • 若上述值不存在,则使用character_set_server设定值。

复制代码

  1. MySQL
    Server收到请求时将呼吁数据从character_set_client转换为character_set_connection;
    2.
    拓展之中操作前将请求数据从character_set_connection转换为其中操作字符集,其规定方法如下:
           – 使用各样数据字段的CHARACTER SET设定值;
           – 若上述值不存在,则使用相应数据表的DEFAULT CHARACTER
    SET设定值(MySQL增添,非SQL标准);
           – 若上述值不存在,则运用相应数据库的DEFAULT CHARACTER
    SET设定值;
           – 若上述值不设有,则使用character_set_server设定值。

  2. 将操作结果从里头操作字符集转换为character_set_results。

            暗中认可景况下的mysql暗中同意字符集是latin1

– mysql> SHOW VARIABLES LIKE ‘character%’;

 
  大家先天回过头来分析下大家发出的乱码问题:
          a
我们的字段没有安装字符集,因而使用表的数据集
          b
大家的表没有点名字符集,私行认同使用数据库存的字符集
          c
我们的数据库在创制的时候从不点名字符集,因而使用character_set_server设定值
          d
我们从不特意去修改character_set_server的指定字符集,因而接纳mysql默许
          e
mysql私行认同的字符集是latin1,由此,我们选择了latin1字符集,而我辈character_set_connection的字符集是UTF-8,插入中文乱码也再所难免了。

        修改暗中认同字符集:
            1.最简便易行的改动章程:
                在mysql的布署文件中参预default-character-set = utf8
                                    character_set_server = utf8
                    修改完后重启服务器
            2.在线修改字符集
                     mysql> SET character_set_client = utf8;
                     mysql> SET character_set_connection = utf8;
                     mysql> SET character_set_database = utf8;
                     mysql> SET character_set_results = utf8;
                     mysql> SET character_set_server = utf8;
                     mysql> SET collation_connection = utf8;
                     mysql> SET collation_database = utf8;
                     mysql> SET collation_server = utf8;

  1. 将操作结果从中间操作字符集转换为character_set_results。

+————————–+———————————+
| Variable_name            | Value                           |
+————————–+———————————+
| character_set_client     | utf8                            |
| character_set_connection | utf8                            |
| character_set_database   | utf8                            |
| character_set_filesystem | binary                          |
| character_set_results    | utf8                            |
| character_set_server     | utf8                            |
| character_set_system     | utf8                            |
| character_sets_dir       | D:Program FilesMySQLMySQL Server
5.1sharecharsets |
+————————–+———————————+
 
– mysql> SHOW VARIABLES LIKE ‘collation_%’;

广大难题浅析
• FAQ-1
向暗许字符集为utf8的数额表插入utf8编码的数额前没有安装连接字符集,查询时设置连接字符集为utf8
     –
插入时根据MySQL服务器的默认设置,character_set_client、character_set_connection和character_set_results均为latin1;
     –
插入操作的数额将透过latin1=>latin1=>utf8的字符集转换进程,这一历程中各种插入的汉字都会从原来的3个字节变成6个字节保存;
     –
查询时的结果将经过utf8=>utf8的字符集转换进程,将保存的6个字节维持原状再次来到,爆发乱码。

向专断认同字符集为latin1的数码表插入utf8编码的数码前安装了连接字符集为utf8(大家相见的一无所能就是属于这一种
     –
插入时依据三番五次字符集设置,character_set_client、character_set_connection和character_set_results均为utf8;
    
–插入数据将由此utf8=>utf8=>latin1的字符集转换,若原始数据中隐含\u0000~\u00ff范围以外的Unicode字符,会因为无法在latin1字符集中代表而被撤换为“?”(0×3F)符号,未来查询时不管连接字符集设置什么样都不能復苏其内容了。
 
检测字符集难题的一些伎俩
    • SHOW CHARACTER SET;
    • SHOW COLLATION;
    • SHOW VARIABLES LIKE ‘character%’;
    • SHOW VARIABLES LIKE ‘collation%’;
    • SQL函数HEX、LENGTH、CHAR_LENGTH
    • SQL函数CHARSET、COLLATION
 
利用MySQL字符集时的提出
    •
建立数据库/表和展开数据库操作时尽量显式提议接纳的字符集,而不是借助于MySQL的暗中认可设置,否则MySQL升级时恐怕带来很大困扰;
    •
数据库和连接字符集都拔取latin1时,尽管多数气象下都得以缓解乱码难题,但缺点是无力回天以字符为单位来举行SQL操作,一般景色下将数据库和连接字符集都置为utf8是较好的选用;
    • 使用mysql
CAPI(mysql提供C语言操作的API)时,开头化数据库句柄后立马用mysql_options设定MYSQL_SET_CHARSET_NAME属性为utf8,那样就绝不显式地用SET
NAMES语句指定连接字符集,且用mysql_ping重连断开的长连接时也会把连接字符集重置为utf8;
    • 对于mysql PHP
API,一般页面级的PHP程序总运行时刻较短,在一连到数据库以往显式用SET
NAMES语句设置五回接二连三字符集即可;但当使用长连接时,请留意保持一而再通畅并在断开重连后用SET
NAMES语句显式重置连接字符集。
 
其余注意事项
    •
my.cnf中的default_character_set设置只影响mysql命令连接服务器时的总是字符集,不会对运用libmysqlclient库的应用程序暴发其他成效!
    •
对字段进行的SQL函数操作平时都以以其中操作字符集举行的,不受连接字符集设置的震慑。
    •
SQL语句中的裸字符串会惨遭连接字符集或introducer设置的影响,对于相比较之类的操作大概暴发完全两样的结果,需求小心!
 
总结
    依据地点的辨析和指出,大家消除我们相遇标题应该拔取什么办法我们心中应该相比较清楚了。对,就是在成立database的时候指定字符集,不要去通过改动默许配置来达到目标,当然你也足以选用指定表的字符集的款式,但很简单出现遗漏,越发是在很三个人都参加安排的时候,更便于纰漏。
 
   
即使不提倡通过修改mysql的暗中同意字符集来化解,但对此什么去修改默许字符集,我那里如故交给一些措施,仅供大家参考。
 
MySQL暗许字符集
MySQL对于字符集的指定可以细化到一个数据库,一张表,一列.传统的主次在开创数据库和数目表时并没有动用那么复杂的陈设,它们用的是专擅认同的配置.
    (1)编译MySQL
时,指定了一个暗中同意的字符集,这几个字符集是 latin1;
    (2)安装MySQL 时,可以在配置文件
(my.ini)
中指定一个专擅认同的的字符集,若是没指定,这几个值继承自编译时指定的;
    (3)启动mysqld
时,可以在命令行参数中指定一个暗中认同的的字符集,若是没指定,那些值继承自配置文件中的配置,此时
character_set_server 被设定为这几个私行认同的字符集;
    (4)安装
MySQL选取多语言匡助,安装程序会自动在布署文件中把default_character_set
设置为 UTF-8,保险缺省气象下具有的数据库所有表的装有列的都用 UTF-8
存储。
查阅默许字符集
    (暗中同意情状下,mysql的字符集是latin1(ISO_8859_1),怎样查看在上边我们早已提交了有关命令
修改暗中认同字符集
(1)
最不难易行的改动章程,就是修改mysql的my.ini文件中的字符集键值,
     如    default-character-set = utf8
      character_set_server =  utf8
     修改完后,重启mysql的劳动
(2)
还有一种修改字符集的法子,就是采用mysql的一声令下
     mysql> SET character_set_client =
utf8 ;
     mysql> SET
character_set_connection = utf8 ;
     mysql> SET character_set_database
= utf8 ;
     mysql> SET character_set_results
= utf8 ;
     mysql> SET character_set_server =
utf8 ;
     mysql> SET collation_connection =
utf8 ;
     mysql> SET collation_database =
utf8 ;
     mysql> SET collation_server = utf8
;
 
   
设置了表的暗中认同字符集为utf8并且经过UTF-8编码发送查询,存入数据库的如故是乱码。那connection连接层上或然出了难题。化解办法是在发送查询前执行一下上边那句:
SET NAMES ‘utf8’;它一定于上面的三句发号施令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection =
utf8;

          
 设置了表的暗许字符集为utf8并且通过UTF-8编码发送查询,存入数据库的如故是乱码.那connection连接层上可能出了难点
            解决办法是在殡葬查询前执行一下上面那句:SET NAMES
‘utf8’;它一定于上面的三句发号施令:
                SET character_set_client = utf8;
                SET character_set_results = utf8;
                SET character_set_connection = utf8;

俺们后天回过头来分析下大家发出的乱码难题:
a 大家的字段没有安装字符集,由此使用表的数据集
b 我们的表没有点名字符集,暗中同意使用数据库存的字符集
c
我们的数据库在创立的时候从不点名字符集,由此使用character_set_server设定值
d
大家从未专门去修改character_set_server的指定字符集,由此采纳mysql私行认同
e
mysql暗中认同的字符集是latin1,因而,大家利用了latin1字符集,而我辈character_set_connection的字符集是UTF-8,插入汉语乱码也再所难免了。

+———————-+—————–+

排序难点:

温馨周末放假没事学习的体会,如有不对请提出.多谢!

广泛难题分析
• FAQ-1
向暗许字符集为utf8的数量表插入utf8编码的数近日从未有过安装连接字符集,查询时设置连接字符集为utf8

插入时依照MySQL服务器的暗中同意设置,character_set_client、character_set_connection和character_set_results均为latin1;

插入操作的数码将经过latin1=>latin1=>utf8的字符集转换进度,这一经过中每种插入的方块字都会从原来的3个字节变成6个字节保存;

查询时的结果将透过utf8=>utf8的字符集转换进程,将保存的6个字节原封不动重临,发生乱码。参考下图:

向暗中认同字符集为latin1的多寡表插入utf8编码的多寡前安设了连接字符集为utf8(大家碰着的错误就是属于这一种)

插入时依据一而再字符集设置,character_set_client、character_set_connection和character_set_results均为utf8;
–插入数据将透过utf8=>utf8=>latin1的字符集转换,若原始数据中蕴藏\u0000~\u00ff范围以外的Unicode字符,会因为不能在latin1字符集中代表而被转换为“?”(0×3F)符号,未来查询时不管连接字符集设置什么样都无法儿苏醒其内容了。转换进度如下图:

| Variable_name        | Value        |

 

检测字符集难点的一些一手
• SHOW CHARACTER SET;
• SHOW COLLATION;
• SHOW VARIABLES LIKE ‘character%’;
• SHOW VARIABLES LIKE ‘collation%’;
• SQL函数HEX、LENGTH、CHAR_LENGTH
• SQL函数CHARSET、COLLATION

+———————-+—————–+

ci 是 case insensitive, 即 “大小写不灵动”, a 和 A
会在字符判断中会被看作一样的。
bin 是二进制, a 和 A 会别分歧对待。

应用MySQL字符集时的指出

建立数据库/表和展开数据库操作时尽恐怕显式提出采纳的字符集,而不是借助于MySQL的默许设置,否则MySQL升级时恐怕带来很大苦恼;

数据库和连接字符集都应用latin1时,尽管大部分情状下都得以缓解乱码难题,但缺点是心有余而力不足以字符为单位来拓展SQL操作,一般景况下将数据库和连接字符集都置为utf8是较好的取舍;
• 使用mysql
CAPI(mysql提供C语言操作的API)时,先导化数据库句柄后旋即用mysql_options设定MYSQL_SET_CHARSET_NAME属性为utf8,那样就不要显式地用SET
NAMES语句指定连接字符集,且用mysql_ping重连断开的长连接时也会把连接字符集重置为utf8;
• 对于mysql PHP
API,一般页面级的PHP程序总运行时刻较短,在连年到数据库将来显式用SET
NAMES语句设置一回一连字符集即可;但当使用长连接时,请小心保持接二连三通畅并在断开重连后用SET
NAMES语句显式重置连接字符集。

| collation_connection   | utf8_general_ci  |

譬如说你运行:

其余注意事项

my.cnf中的default_character_set设置只影响mysql命令连接服务器时的连年字符集,不会对应用libmysqlclient库的应用程序暴发其他成效!

对字段进行的SQL函数操作平时都以以中间操作字符集举办的,不受连接字符集设置的影响。

SQL语句中的裸字符串会遭到连接字符集或introducer设置的影响,对于相比较之类的操作只怕发生完全两样的结果,须要小心!

| collation_database    | utf8_general_ci  |

SELECT * FROM table WHERE txt = 'a';

总结
根据下边的剖析和指出,大家缓解我们相遇标题应该利用什么办法大家心里应该比较清楚了。对,就是在开立database的时候指定字符集,不要去通过修改暗中认同配置来达到目的,当然你也足以行使指定表的字符集的花样,但很容易出现遗漏,尤其是在很几人都踏足统筹的时候,更便于纰漏。

| collation_server      | utf8_general_ci  |

  • 1
虽然不提倡通过修改mysql的默认字符集来解决,但对于如何去修改默认字符集,我这里还是给出一些方法,仅供大家参考。

+———————-+—————–+

那么在utf8_bin中您就找不到 txt = ‘A’ 的那一行, 而 utf8_general_ci
则可以。

MySQL暗许字符集
MySQL对于字符集的指定可以细化到一个数据库,一张表,一列.传统的次第在创建数据库和数目表时并从未运用那么复杂的配置,它们用的是暗中同意的配置.
(1)编译MySQL 时,指定了一个专断认同的字符集,那一个字符集是 latin1;
(2)安装MySQL 时,可以在布置文件 (my.ini)
中指定一个暗许的的字符集,假若没指定,那一个值继承自编译时指定的;
(3)启动mysqld
时,可以在命令行参数中指定一个暗中认可的的字符集,尽管没指定,这么些值继承自配置文件中的配置,此时
character_set_server 被设定为那么些私行认同的字符集;
(4)安装
MySQL选用多语言支持,安装程序会活动在布署文件中把default_character_set
设置为 UTF-8,保障缺省气象下拥有的数据库所有表的拥有列的都用 UTF-8
存储。
翻看默许字符集
(私下认同意况下,mysql的字符集是latin1(ISO_8859_1),怎么着查看在地点我们已经交给了相关命令
修改专擅认同字符集
(1) 最简便的改动章程,就是修改mysql的my.ini文件中的字符集键值,
如 default-character-set = utf8
character_set_server = utf8
修改完后,重启mysql的劳务
(2) 还有一种修改字符集的办法,就是应用mysql的命令
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;

 
2、修改暗中认同字符集 (1)
最简便易行的修改章程,就是修改mysql的my.ini文件中的字符集键值(共6个),如:
[client]

一、Some tips:
utf8_general_ci:不区分轻重缓急写,那一个您在注册用户名和信箱的时候就要动用。
utf8_general_cs:区分轻重缓急写,如果用户名和信箱用那么些就会照成不良后果。
utf8_bin:字符串各种字符串用二进制数据编译存储。
区分轻重缓急写,而且可以存二进制的始末。

设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,存入数据库的仍然是乱码。那connection连接层上可能出了问题。解决方法是在发送查询前执行一下下面这句: SET NAMES 'utf8';它相当于下面的三句指令:

 代码如下

二、简短总括
utf8_unicode_ci和utf8_general_ci对中、英文来说没有精神的分歧。
utf8_general_ci:核查速度快,但准确度稍差。
utf8_unicode_ci:准确度高,但核对进度稍慢。
一旦您的行使有保加莱切斯特语、荷兰语只怕葡萄牙语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了,到方今也没觉察难点。

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

复制代码

三、详细总计
1、对于一种语言仅当使用utf8_unicode_ci排序做的不佳时,才实施与现实语言相关的utf8字符集查对规则。例如,对于克罗地亚共和国语和立陶宛(Lithuania)语,utf8_unicode_ci工作的很好,由此不再需要为这二种语言成立特殊的utf8核查规则。
2、utf8_general_ci也适用与斯洛伐克语和斯洛伐克(Slovak)语,除了‘?’等于‘s’,而不是‘ss’之外。若是你的运用能够经受这一个,那么相应运用
utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它相比较标准。
用一句话轮廓下面那段话:utf8_unicode_ci比较确切,utf8_general_ci速度相比快。经常状态下
utf8_general_ci的准确性就够我们用的了,在本身看过众多顺序源码后,发现它们超过一半也用的是utf8_general_ci,所以新建数据
库时相似选拔utf8_general_ci就可以了

default-character-set = utf8

注:以上内容摘自网络

default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = ‘SET collation_connection = utf8_general_ci ‘
init_connect = ‘SET NAMES utf8’

 

修改完后,重启mysql的劳动。

(2) 还有一种修改字符集的形式,就是利用mysql的指令:

 代码如下

复制代码

– mysql> SET character_set_connection = utf8 ;
– mysql> SET character_set_database = utf8 ;
– mysql> SET character_set_server = utf8 ;
– mysql> SET collation_server = utf8 ;
– mysql> SET collation_database = utf8 ;
– mysql> SET character_set_client = utf8 ;
– mysql> SET character_set_results = utf8 ;
– mysql> SET collation_connection = utf8 ;

诚如就是设置了表的默许字符集为utf8并且通过UTF-8编码发送查询,你会意识存入数据库的照样是乱码。难点就出在那么些connection连接层上。

涸泽而渔办法是在发送查询前履行一下下边那句:

 代码如下

复制代码

SET NAMES ‘utf8’;

它约等于下边的三句发号施令:

 代码如下

复制代码

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

 
检测字符集难点的一些手腕

 • SHOW CHARACTER SET;  #查阅mysql援助的字符集
 • SHOW COLLATION;      #翻开mysql的字符种类(排序格局)
 • SHOW VARIABLES LIKE ‘character%’;  #查看mysql系统暗中同意字符集设置值
 • SHOW VARIABLES LIKE ‘collation%’;
#翻看mysql系统暗许的字符连串(排序格局) 设置值
 • SQL函数HEX、LENGTH、CHAR_LENGTH
 • SQL函数CHARSET、COLLATION
 
MySQL中的字符集转换进程:

  1. MySQL
    Server收到请求时将呼吁数据从character_set_client转换为character_set_connection;
    2.
    开展之中操作前将呼吁数据从character_set_connection转换为内部操作字符集,其规定方法如下:
      – 使用各样数据字段的CHARACTER SET设定值;
      – 若上述值不设有,则使用相应数据表的DEFAULT CHARACTER
    SET设定值(MySQL伸张,非SQL标准);
      – 若上述值不设有,则动用相应数据库的DEFAULT CHARACTER SET设定值;
      – 若上述值不存在,则应用character_set_server设定值。
  2. 将操作结果从中间操作字符集转换为character_set_results。
      
    大家发出的乱码难题:
    a 大家的字段没有设置字符集,由此使用表的数据集;
    b 我们的表没有点名字符集,暗中认同使用数据库存的字符集;
    c
    大家的数据库在创设的时候没有点名字符集,由此使用character_set_server设定值;
    d
    大家并未专门去修改character_set_server的指定字符集,由此选用mysql暗中同意;
    e
    mysql默许的字符集是latin1,由此,大家利用了latin1字符集,而咱们character_set_connection的字符集是UTF-8,插入中文乱码也再所难免了。
     
    MySQL专断认同字符集:

MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。然则传统的次第在创立数据库和多少表时并从未利用那么复杂的配置,它们用的是暗中认同的配置,那么,私行认同的配备从何而来呢?
(1)编译MySQL 时,指定了一个默许的字符集,这几个字符集是 latin1;
(2)安装MySQL 时,可以在布置文件 (my.ini)
中指定一个暗许的的字符集,尽管没指定,这么些值继承自编译时指定的;
(3)启动mysqld
时,可以在命令行参数中指定一个暗中同意的的字符集,固然没指定,这些值继承自配置文件中的配置,此时
character_set_server 被设定为这一个专断认同的字符集;
(4)当创制一个新的数据库时,除非明确指定,这些数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database
被设定为这么些数据库专断认同的字符集;
(6)在这么些数据库里创设一张表时,表暗中同意的字符集被设定为
character_set_database,约等于其一数据库暗中同意的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表暗中认同的字符集;
简简单单的计算一下,假诺什么地点都不改动,那么所有的数据库的所有表的享有栏位的都用
latin1 存储,然而我们只要设置
MySQL,一般都会挑选多语言帮衬,约等于说,安装程序会活动在布局文件中把default_character_set
设置为 UTF-8,那保障了缺省情况下,所有的数据库的所有表的保有栏位的都用
UTF-8 存储。
 
普遍难点分析

1)向默许字符集为utf8的数码表插入utf8编码的数码前从未有过安装连接字符集,查询时设置连接字符集为utf8
 –
插入时按照MySQL服务器的私行认同设置,character_set_client、character_set_connection和character_set_results均为latin1;
997755.com澳门葡京 , –
插入操作的多上将通过latin1=>latin1=>utf8的字符集转换进度,这一进度中各样插入的汉字都会从原有的3个字节变成6个字节保存;
 –
查询时的结果将由此utf8=>utf8的字符集转换进度,将保存的6个字节原封不动重返,暴发乱码。
  
2)向专断认同字符集为latin1的数额表插入utf8编码的数额前安设了连年字符集为utf8(大家相遇的谬误就是属于这一种)
 –
插入时依据三番五次字符集设置,character_set_client、character_set_connection和character_set_results均为utf8;
 -插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中蕴藏u0000~u00ff范围以外的
Unicode字符,会因为不能在latin1字符集中代表而被更换为“?”(0×3F)符号,以后查询时不管连接字符集设置什么样都心有余而力不足复苏其内容了。
  
运用MySQL字符集时的提出


建立数据库/表和展开数据库操作时尽量显式提议拔取的字符集,而不是着重于MySQL的暗中认同设置,否则MySQL升级时恐怕带来很大干扰;

数据库和连接字符集都使用latin1时,即便大多数气象下都得以消除乱码难点,但缺点是心有余而力不足以字符为单位来拓展SQL操作,一般景况下将数据库和连接字符集都置为utf8是较好的精选;
• 使用mysql
CAPI(mysql提供C语言操作的API)时,开头化数据库句柄后及时用mysql_options设定
MYSQL_SET_CHARSET_NAME属性为utf8,那样就毫无显式地用SET
NAMES语句指定连接字符集,且用mysql_ping重连断开的长连接时也会把连接字符集重置为utf8;
• 对于mysql PHP
API,一般页面级的PHP程序总运行时刻较短,在连接到数据库将来显式用SET
NAMES语句设置一回一连字符集即可;但当使用长连接时,请留心保持接二连三通畅并在断开重连后用SET
NAMES语句显式重置连接字  符集。
 
此外注意事项


my.cnf中的default_character_set设置只影响mysql命令连接服务器时的连接字符集,不会对利用libmysqlclient库的应用程序爆发其他功效!

对字段进行的SQL函数操作日常都以以内部操作字符集举行的,不受连接字符集设置的影响。

SQL语句中的裸字符串会遭到连接字符集或introducer设置的震慑,对于比较之类的操作或然暴发完全不相同的结果,须求小心!
   
总结

依照地点的辨析和提出,大家解决大家遇到难题应有使用什么点子我们心中应该比较清楚了。对,就是在创建database的时候指定字符集,不要去通过修改暗中同意配置来达成目的,当然你也可以运用指定表的字符集的方式,但很不难并发遗漏,尤其是在很三人都插足统筹的时候,更易于纰漏。

所以,使用什么数据库版本,不管是3.x,仍然4.0.x依旧4.1.x,其实对我们来说不根本,主要的有两点

1.毋庸置疑的设定数据库编码。MySQL4.0之下版本的字符集总是暗中认同ISO8859-1,MySQL4.1在装置的时候会让您选拔。倘使您准备选取UTF-
8,那么在开创数据库的时候将要指定好UTF-8(成立好之后也得以改,4.1之上版本还是能独立指定表的字符集)
2.科学的设定数据库connection编码。设置好数据库的编码后,在连年数据库时候,应该指定connection的编码,比如动用jdbc连接时,指定连接为utf8方法。

VARIABLES
LIKE
character即可,修改大家须要修改my.ini中的配置格局了,上边我联合来看看。
方今,在档次组…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website