官网地址:https://dev.mysql.com/doc/refman/5.7/en/charset.html
字符集是指一种从二进制编码到某类字符符号的映射,校对是指一组用于某个字符集的排序规则。并且每一类编码字符都有其对应的字符集合校对规则。
基本信息
MySql支持多种字符集,我们可以通过use the INFORMATION_SCHEMA CHARACTER_SETS table or the SHOW CHARACTER SET statement来查看字符集
SHOW CHARACTER SET;OR SHOW CHARACTER SET LIKE 'latin%';
给定的字符集至少会有一个指定的规则,但是不同的字符集不能有相同的校验规则,我们可以通过use the INFORMATION_SCHEMA COLLATIONS table or the SHOW COLLATION 来查看某个字符集对应的规则
show collation where charset = 'latin1';
字符集和排序规则的级别
服务器、数据库、表和列
服务器字符集设置
可以通过在服务器启动时进行设置或者通过修改my.ini、my.cnf等配置文件进行设置
mysqld
mysqld --character-set-server=latin1
mysqld --character-set-server=latin1 \
--collation-server=latin1_swedish_ci
若不指定字符集的前提,前两种命令行意义是相同的,默认的字符集是latin1,若不指定校验规则的话,这三种表达的意义是相同的
重新编译更改字符集和校验规则
cmake . -DDEFAULT_CHARSET=latin1
or
cmake . -DDEFAULT_CHARSET=latin1 \
-DDEFAULT_COLLATION=latin1_german1_ci
修改配置文件更改字符集和校验规则
[mysqld]
...
skip-character-set-client-handshake
collation-server=utf8_unicode_ci
character-set-server=utf8
数据库字符集和校验规则设置
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;
查看数据库的字符集和校验规则
USE db_name;
SELECT @@character_set_database, @@collation_database;
OR
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';
注:
- 如果指定了字符集和校验规则,则使用指定的校验规则和字符集
- 如果只指定了字符集没有指定校验规则,则使用默认的校验规则
- 如果指定了校验规则没有指定字符集,则使用和校验规则关联的字符集
- 如果字符集和校验规则都没有指定的话则使用服务的字符集和排序规则
表字符集和校验规则设置
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]
例子
CREATE TABLE t1 ( ... )
CHARACTER SET latin1 COLLATE latin1_danish_ci;
- 如果指定了字符集和校验规则,则使用指定的校验规则和字符集
- 如果只指定了字符集没有指定校验规则,则使用默认的校验规则
- 如果指定了校验规则没有指定字符集,则使用和校验规则关联的字符集
- 否则则使用数据库字符集和排序规则
列定义字符集和校验规则
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
col_name {ENUM | SET} (val_list)
[CHARACTER SET charset_name]
[COLLATE collation_name]
例子
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;
注:
- 如果指定了字符集和校验规则,则使用指定的校验规则和字符集
- 如果只指定了字符集没有指定校验规则,则使用默认的校验规则
- 如果指定了校验规则没有指定字符集,则使用和校验规则关联的字符集
- 否则则使用表的字符集和排序规则
比较好的文章