mysql支持使用不同的字符集存储数据,支持四个级别的字符集设置:server、database、table 和 column。 MyISAM
, MEMORY
, and InnoDB
三个存储引擎都支持不同的字符集设置。
本文参考:mysql 官网 http://www.mysql.com/
一、字符集和比对规则
字符集(character set):是一组符号和编码
比对规则(collation):是一组字符比对的规则
举例:
假设 A=0 , B=1 ,a=2, b=3。那么其中A 就是一个符号,0就是一个编码。 4个字母和他们编码的总和被称为字符集。
1.如果我们想要比较字符 A 和 B的大小,那么我们使用他们的编码 0 和 1 进行比较,得A<B。
这种比对规则 只包含了一种规则(编码的比较),我们称之为二进制比对规则。
2.如果我们不区分大小写,那么A 是=a的。
这种比对规则包含了两种规则,1)大小写字母相等。 2)比较编码。我们称之为大小写敏感的比对规则
但是,在实际生活中,字符集都包含大量的字母和符号。比对规则也包含众多的规则。
mysql可以做什么呢?
1)使用不同的字符集来存储字符。
2)使用不同的比对规则来进行字符的比较。
3)在同一台服务器、数据库甚至数据表中,混合使用不同的字符集。
二、mysql 中支持的字符集和比对规则
安装好mysql server之后,可以通过两种方式来查看其支持的character sets 和 collation。
1)查看系统表:INFOMATION_SCHEMA CHARACTER_SETS
2)使用命令:SHOW CHARACTER_SET (可跟 like where 条件表达式)
一套字符集可能会使用多种比对规则,查看方法如下:
1)查看系统表:INFOMATION_SCHEMA COLLATIONS
2)使用命令:SHOW COLLATION (可跟 like where 条件表达式)
三、在mysql中指定字符集和比对规则
Server character set 和 collation-server(服务器级别的字符集)
1.启动服务时指定
Mysqld --character-set-server=latin1 --collation-server=latin1_swedish_ci
2.配置文件指定
[mysqld]
character-set-server=latin1
collation-server=latin1_swedish_ci
Database character set 和 collation (数据库级别)
1.创建时
Create database db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
2.修改时
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
注:所有的database options 都保存在database文件的 db.opt 文本文件中
查看当前数据库设置的字符集信息
USE db_name;
SELECT @@character_set_database, @@collation_database;
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';
Table character set 和 collation (表级别)
同database level
CREATE TABLE tbl_name
(column_list
)
[[DEFAULT] CHARACTER SET charset_name
]
[COLLATE collation_name
]]
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name
]
[COLLATE collation_name
]
Column character set 和 collation (列级别)
col_name
{CHAR | VARCHAR | TEXT} (col_length
)
[CHARACTER SET charset_name
]
[COLLATE collation_name
]
Examples:
CREATE TABLE t1
(
col1 VARCHAR(5)
CHARACTER SET latin1
COLLATE latin1_german1_ci
);
ALTER TABLE t1 MODIFY
col1 VARCHAR(5)
CHARACTER SET latin1
COLLATE latin1_swedish_ci;
字符串的 character 和 collation (普通字符串级别)
Select ‘string’ 使用的是character_set_connection 指定的字符集
字符 的 字符集指定语法
[_charset_name
]'string
' [COLLATE collation_name
]
Examples:
SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8'abc' COLLATE utf8_danish_ci;
四、client-server 程序交互涉及到的字符集和比对规则
数据最终的存储编码
1.系统变量Character_set_server和 collation_server 设置服务器程序的字符集及比对顺序
1.系统变量character_set_database和collation_database 标识了数据库默认的字符集
Client 和 server 进行信息交互所使用的编码
1.系统变量character_set_client标识了客户端程序发送到服务端程序所使用的字符集
2.Server使用 character_set_connection 和collation_connection 标识的字符集来翻译来自client的sql 命令
3.Character_set_results:server返回执行结果所使用的编码
Client 程序所使用的字符编码
注:默认使用OS上的默认编码。若、mysql不支持OS默认编码,则使用mysql默认编码latin1
编码修改方法:
1. client 启动时,增加选项 --default-character-set=char-name
2. 配置文件my.ini中指定
[mysql]
Default-character-set=char-name
注:此时c-s交互编码会自动被设置为 以上编码