风之力科技
股票代码:781340
400-718-5885或13605745691
service@nwpit.com

技术资讯

11May2016
点击

mysql教程-字符集和校对集

主要目的:解决大家在开发过程出现的乱码。

什么是字符集?

Character set可以简写为charset。

每种文字有自己的一套编码方式。

对于字符集的支持细化到四个层次:

服务器(server)

数据库(database) 

数据表(table)

连接(connection)。

MySQL默认字符集

MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,该用什么字符集。

但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?   

(1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;

(2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集(character_set_server),如果没指定,这个值继承自编译时指定的;

(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 存储。

系统变量:

– character_set_server:默认的内部操作字符集

– character_set_client:客户端来源数据使用的字符集

– character_set_connection:连接层字符集

– character_set_results:查询结果字符集

– character_set_database:当前选中数据库的默认字符集

– character_set_system:系统元数据(字段名等)字符集 

MySQL中的字符集转换过程

我们在设置的时候,对于Character_set_client,Character_set_connection,Character_set_results,尽量保持一致,且为utf8或gbk,建议使用urf8。

如果Character_set_client,Character_set_connection,Character_set_results三者的值都是N,那么我们可以将其简化为set names N。

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。

#p#mysql 字符集使用注意事项#e#

使用MySQL字符集时的建议

? 建立数据库/表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于MySQL的默认设置,否则MySQL升级时可能带来很大困扰;

? 数据库和连接字符集都使用latin1时虽然大部分情况下都可以解决乱码问题,但缺点是无法以字符为单位来进行SQL操作,一般情况下将数据库和连接字符集都置为utf8是较好的选择;

? 对于mysql PHP API,一般页面级的PHP程序总运行时间较短,在连接到数据库以后显式用SET NAMES语句设置一次连接字符集即可;但当使用长连接时,请注意保持连接通畅并在断开重连后用SET NAMES语句显式重置连接字符集。

问题:

什么时候出现乱码?

1. 客户端发送的和数据库存储的编码不一致。

2. 返回编码的和客户端的编码不一致。

其他注意事项

什么是校对集?(了解即可)

说白了,就是字符排序的方式。

一种字符集有多种校对集。

字符集编码是utf8,默认的就是 utf8_general_ci,ci表示不区分大小写。