您的位置:首页 > 数据库 > MySQL

MySql(20)------mysql字符集的设置

2016-08-30 09:46 211 查看
 一 MySql字符集概要

MySql服务器支持多种支付集,灵活性很强。

查看MySql可用字符集命令show character set:



MySql字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。

字符集用来定义MySql存储字符串的方式,校对规则用来定义比较字符串的方式。

字符集和校对规则是一对多的关系,支持30多种字符集和70多种校对规则。

每个字符集至少对应一种校对规则。用show collation like '******'命令或者系统表information_schema.COLLATIONS

来查看相关字符集的校对规则。

eg:

mysql 5.7的utf8有很多校对规则,全部截图太长,



校对规则命名规则:

以相关字符集开始,通常包括一个语言名,以_ci(大小写不敏感), _cs(大小写敏感) 或_bin(二元,比较基于字符编码值与语言无关)结束。

比如,utf8_general_ci字符串比较对大小写不敏感,而utf8_bin对字符串大小写比较敏感。

如果,使用utf8字符集,utf8-general_ci校对规则,‘A’与'a'比较时认为是一样的,而 如果使用utf8_bin则认为是不一样的。

二 MySql字符集设置

MySql字符集和校对规则有4个级别的默认设置,分别为:

服务器级,数据库级,表级,字段级。

2.1 服务器级别

服务器级别字符集可以在启动时指定

第一种方式,在配置文件中指定,windows在my.ini中,linux在my.cnf中,一般文件是这样的,可以根据自己的情况,找到数据库配置修改。

[mysqld]

# 服务端使用的字符集默认为8比特编码的latin1字符集

character-set-server=utf8

第二种方式,在启动项中指定

mysqld --character-set-server=utf8

第三种方式,编译时指定

shell> cmake . -DDEFAULT_CHARSET=utf8

通过上面这种方式,我们只是指定了mysql服务字符集,对应的校对规则用的是指定字符集默认的校对规则,如果需要

修改校对规则,需要在指定字符集后进行校对规则修改。

我们可以通过show variables like 'character_set_server'查看当前数据库服务的字符集,

通过show variables like 'collation_server'查看数据库服务字符集对应的校对规则。

eg:



2.2 数据库级别

数据库字符集和校对规则可以在创建数据库时指定,也可以在创建完数据库之后进行修改。

如果数据库中已经存放数据,修改数据库字符集并不能修改旧数据,只针对新数据存放有效。

对旧数据需要单独对数据进行修改。

数据库字符集和校对规则修改原则:

(1)如果修改了字符集和校对规则,则使用指定的字符集和校对规则。

(2)如果修改了字符集,没有修改校对规则,则使用指定的字符集和字符集对应的默认校对规则。

(3)如果修改了校对规则,没有修改字符集,则使用校对规则对应的字符集和指定的校对规则。

(4)如果字符集和校对规则都没有指定,则使用数据库服务对应的字符集和校对规则。

我们可以使用show variables like 'character_set_database'查看字符集,

使用show variables like 'collation_database'查看校对规则,

通过alter database修改,

如alter database database_name character set gbk修改字符集,

alter database database_name collate gbk_bin修改校对规则,

alter database table_name character set gbk collate gbk_bin一起修改。

eg:



2.3 表级别

与数据库级别修改规则类似,通过通过alter table修改。

alter table table_name character set gbk修改字符集,

alter table table_name collate gbk_bin修改校对规则,

alter table table_name character set gbk collate gbk_bin一起修改。

表级别字符集和校对规则修改原则:

(1)如果修改了字符集和校对规则,则使用指定的字符集和校对规则。

(2)如果修改了字符集,没有修改校对规则,则使用指定的字符集和字符集对应的默认校对规则。

(3)如果修改了校对规则,没有修改字符集,则使用校对规则对应的字符集和指定的校对规则。

(4)如果字符集和校对规则都没有指定,则使用数据库级别对应的字符集和校对规则。
一般建议在创建表时指定字符集和校对规则,避免受默认值影响。

通过show create table table_name \G 命令查看,但是如果使用的是默认的,是看不到校对规则的,

为了能看到效果,不使用默认:

eg:



表结构中最后可以看到校对规则COLLATE=utf8-bin;

2.4 列级别

如果使用创建时没有指定列级别,默认使用表级别的字符集和校对规则。很少使用。

三 连接字符集和校对规则

在实际使用中,除了4中设置外,还分为客户端和服务器端字符集和校对规则设置。

客户端和服务器端设置有3个参数:character_set_client,character_ser_connection,character_set_results,

这3个分别代表客户端,连接和返回结果字符集。一般情况下,这3个字符集是一样的,才能保证数据能够

进行正确的读写,特别是中文,不同的字符集写入,而不同的字符集是不能正确读出的,常见的就是乱码问题。

我们可以通过命令设置3个参数字符集一致。

SET NAMES ***;

使用这种方式设置3个参数字符集,需要每次应用数据库时都执行,比如,每次执行脚本时,在脚本第一行都加上set names ***;

eg:

SET NAMES utf8;

永久的办法是修改mysql配置文件,配置客户端字符,

[mysql]

# 设置mysql客户端默认字符集

default-character-set=utf8

重启mysql服务,立刻生效,不用每次更新脚本都带上set names **;有粗心同事忘了,更新的是一堆乱码,神也看不懂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: