深色模式
MySQL 字符集、字符序
这里有一篇文章,讲得非常清楚:再见乱码:5分钟读懂MySQL字符集设置。
下面是简单的笔记:
概念
字符集定义了字符如何编码,比如:utf8
。
字符序定义了该字符集内字符之间的比较规则,比如大小写字母判断相等。
一个字符集对应一或多个字符序,其中有一个是默认字符序。
字符序只会属于某一个字符集,它的名称以该字符集名作为前缀。
四个等级
MySQL 字符集、字符序的设置,分为4个等级:
- server 级
- database 级
- table 级
- column 级
低层级会默认使用上一层级的字符集、字符序设置。即,如果创建一个 database 时指定了字符集是 utf8
,那么该 database 中所有表以及表中的列都默认使用 utf8
。
查看支持的字符集、字符序
查看 MySQL 支持的字符集
方式一:
sh
SHOW CHARACTER SET;
加条件查询:
sh
SHOW CHARACTER SET LIKE "utf8%";
方式二:
sh
use information_schema;
select * from CHARACTER_SETS;
加条件查询:
sh
select * from CHARACTER_SETS WHERE CHARACTER_SET_NAME like '%utf8%';
查看 MySQL 支持的字符序
与上面类似,有两种方式:
sh
SHOW COLLATION WHERE Charset = 'utf8';
sh
USE information_schema;
SELECT * FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8";
server 的字符集
查看
方式一:通过变量查看
分别对应character_set_server
、collation_server
两个系统变量。
默认的字符序分别为latin1
、latin1_swedish_ci
。
sh
SHOW VARIABLES LIKE "character_set_server";
SHOW VARIABLES LIKE "collation_server";
修改
方式一:启动服务时指定
可以在MySQL服务启动时,指定server字符集、字符序。
mysqld --character-set-server=latin1 \
--collation-server=latin1_swedish_ci
可以仅指定server字符集,此时,字符序是latin1
的默认字符序。
mysqld --character-set-server=latin1
方式二:配置文件指定
除了在命令行参数里指定,也可以在配置文件里指定,如下所示。
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
方式三:运行时修改
重启后会失效,如果想要重启后保持不变,需要写进配置文件里。
sh
SET character_set_server = utf8 ;
方式四:编译时指定
character_set_server
、collation_server
的默认值,可以在MySQL编译时,通过编译选项指定:
sh
cmake . -DDEFAULT_CHARSET=latin1 \
-DDEFAULT_COLLATION=latin1_german1_ci
database 的字符集
查看
有3种方式可以查看数据库的字符集/字符序。
假设数据库名是test_schema
:
方式一:通过变量查看
sh
use test_schema;
SELECT @@character_set_database, @@collation_database;
方式二:information_schema.SCHEMATA
sh
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name="test_schema";
方式三:SHOW CREATE DATABASE
sh
SHOW CREATE DATABASE test_schema;
修改
方式一:创建数据库时指定
sh
CREATE DATABASE `test_schema` DEFAULT CHARACTER SET utf8;
方式二:运行时修改
sh
ALTER DATABASE `test_schema` DEFAULT CHARACTER SET utf8;
table 的字符集
假设数据库名是test_schema
,表名是test_table
:
查看
方式一:SHOW TABLE STATUS
sh
SHOW TABLE STATUS FROM test_schema \G;
方式二:information_schema.TABLES
sh
USE test_schema;
SELECT TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = "test_schema" AND TABLE_NAME = "test_table";
方式三:SHOW CREATE TABLE
sh
SHOW CREATE TABLE test_table;
修改
方式一:创建表时指定
sh
CREATE TABLE `test_schema`.`test_table` (
`id` INT NOT NULL COMMENT '',
PRIMARY KEY (`id`) COMMENT '')
DEFAULT CHARACTER SET = utf8;
column 的字符集
查看
方式一:information_schema.COLUMNS
sh
SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA="test_schema" AND TABLE_NAME="test_table" AND COLUMN_NAME="char_column";
修改
方式一:创建列时指定
sh
ALTER TABLE test_table ADD COLUMN char_column VARCHAR(25) CHARACTER SET utf8;
实践
在实践中,最好在 server 级别设置字符集。因为 server 默认字符集不支持中文,会导致用一些工具查看表时,表中的注释显示乱码。所以,在 server 级设置字符集为 utf8
或 utf8mb4
就可以解决中文乱码的问题。
关于
utf8
与utf8mb4
的区别,可以参考Mysql的UTF-8