MySql(20)------mysql字符集的设置
2016-08-30 09:46
211 查看
一 MySql字符集概要
MySql服务器支持多种支付集,灵活性很强。
查看MySql可用字符集命令show character set:
![](http://img.blog.csdn.net/20160830083517048?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
MySql字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。
字符集用来定义MySql存储字符串的方式,校对规则用来定义比较字符串的方式。
字符集和校对规则是一对多的关系,支持30多种字符集和70多种校对规则。
每个字符集至少对应一种校对规则。用show collation like '******'命令或者系统表information_schema.COLLATIONS
来查看相关字符集的校对规则。
eg:
mysql 5.7的utf8有很多校对规则,全部截图太长,
![](http://img.blog.csdn.net/20160830084510054?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
校对规则命名规则:
以相关字符集开始,通常包括一个语言名,以_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:
![](http://img.blog.csdn.net/20160830091229371?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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:
![](http://img.blog.csdn.net/20160830092259411?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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:
![](http://img.blog.csdn.net/20160830092855523?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
表结构中最后可以看到校对规则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 **;有粗心同事忘了,更新的是一堆乱码,神也看不懂。
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 **;有粗心同事忘了,更新的是一堆乱码,神也看不懂。
相关文章推荐
- 远程连接访问mysql
- 通过mysql的表分区解决数据库挂死
- Ubuntu14.04安装mysql5.7
- mysql=null的优雅解决方法
- Mysql锁
- Mysql之主从切换
- MySQL字符集和乱码问题初探
- Leetcode 176. Second Highest Salary
- Leetcode 175. Combine Two Tables
- MySQL 触发器的基础操作(六)
- MySql安装步骤图文教程及中文乱码的解决方案
- Mysql5.5安装配置方法及中文乱码的快速解决方法
- mysql语句优化总结(一)
- mysql密码修改,存储过程的优缺点个人总结
- 使用Navicat for MySQL导出和导入MySQL数据库的表数据-图文教程
- Mysql的完全卸载
- mysql数据库-索引
- MySQL数据表所有操作命令
- JDBC连接MySQL数据库
- Navicat For Mysql快捷键