字符集
-- 查询mysql 字符集相关的系统变量
show variables like 'character_set%';
+--------------------------+--------------------------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\phpstudy_pro\Extensions\MySQL8.0.12\share\charsets\ |
+--------------------------+--------------------------------------------------------+
8 rows in set, 1 warning (0.03 sec)
- character_set_client 客户端数据使用的字符集 MySQL Client发送给mysqld的语句或数据使用字符集。
- character_set_connection 连接层字符集 其实很多人对这个字符集一脸懵逼,这个字符集与character_set_client有啥区别呢? 这个字符集用于没有introducer修饰的字符串和数字到字符串的转换。 由introducer修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。
- character_set_database 数据库字符集 MySQL可以给实例下不同数据库单独设置各自的字符集。这个跟SQL Server是类似的。
- character_set_filesystem 文件系统字符集 该变量用于解释引用文件名的字符串文字,例如在LOAD DATA INFILE和SELECT ... INTO OUTFILE语句和LOAD_FILE()函数中。 在文件打开尝试发生之前,这样的文件名将从character_set_client转换为character_set_filesystem。 默认值为二进制,这意味着不会发生转换。 对于允许多字节文件名的系统,不同的值可能更合适。例如,如果系统使用UTF-8表示文件名,则将character_set_filesystem设置为“utf8”。
- character_set_results 查询结果字符集 mysqld 在返回查询结果集或者错误信息到客户端时,使用的编码字符集
- character_set_server 服务器字符集,默认的字符集 服务器级别(实例级别) 的字符集。如果创建数据库时,不指定字符集,那么就会默认使用服务器的编码字符集。
- character_set_system 系统元数据字符集 它是系统元数据((表|字段)名等)存储时使用的编码字符集,该字段和具体存储的数据无关。总是固定不变的UTF8字符集。
- 另外,之前的版本还有default-character-set,MySQL 5.5版本开始,移除了参数default_character_set 取而代之的是参数 character_set_server。character_set_client、character_set_connection、character_set_results这3个参数值是由客户端每次连接进来设置的,和服务器端没关系。MySQL会存在不同字符集的转换过程。
查询指定字符集 (默认查的是当前数据库的字符集)
show variables like 'character_set_results';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| character_set_results | utf8 |
+-----------------------+-------+
1 row in set, 1 warning (0.00 sec)
查询指定数据库的字符集
show create database mysql;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| mysql | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
查询所有数据库的字符集和排序规则
SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA ;
+--------------------+----------------------------+------------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+--------------------+----------------------------+------------------------+
| mysql | utf8 | utf8_general_ci |
| information_schema | utf8 | utf8_general_ci |
| performance_schema | utf8mb4 | utf8mb4_0900_ai_ci |
| sys | utf8mb4 | utf8mb4_0900_ai_ci |
| sys_demo | utf8mb4 | utf8mb4_general_ci |
+--------------------+----------------------------+------------------------+
5 rows in set (0.00 sec)
查询表的字符集
show create table sys_user;
-- (当前数据库)
Table | Create Table |
sys_user | CREATE TABLE `sys_user` ( `id` bigint(20) NOT NULL, `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `test_char` char(255) COLLATE utf8mb4_general_ci DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT |
SELECT TABLE_SCHEMA, TABLE_NAME,TABLE_COLLATION FROM INFORMATION_SCHEMA.TABLES
where TABLE_SCHEMA='sys_demo' and TABLE_NAME='sys_user' ;
+--------------+------------+--------------------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION |
+--------------+------------+--------------------+
| sys_demo | sys_user | utf8mb4_general_ci |
+--------------+------------+--------------------+
1 row in set (0.00 sec)
查询表中字段的字符集
- 同上查询表的字符集(1) show create table sys_user;
show full columns from sys_user;
+-----------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-----------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| id | bigint(20) | NULL | NO | PRI | NULL | | select,insert,update,references | |
| username | varchar(255) | utf8mb4_general_ci | YES | | NULL | | select,insert,update,references | |
| password | varchar(255) | utf8mb4_general_ci | YES | | NULL | | select,insert,update,references | |
| test_char | char(255) | utf8mb4_general_ci | YES | | NULL | | select,insert,update,references | |
+-----------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
4 rows in set (0.00 sec)
修改字符集
- 修改字段
ALTER TABLE table_name MODIFY cloumn_name VARCHAR(50) CHARACTER SET utf8mb4 ;
- 修改系统变量 (当前环境生效,见3注意)
set character_set_database=utf8mb4;
set global character_set_database=utf8mb4;
- 修改mysql 服务器字符集
set global character_set_server=utf8mb4;
注意,上述命令只对当前环境生效,如果没有在my.cnf设置系统变量character_set_server,那么MySQL服务重启后,就会失效。所以一般在my.cnf配置文件设置系统变量character_set_server。对于系统变量character_set_database也是如此。
- 修改客户端字符集
set names 'charset_name' [collate 'collation_name']
-- 等同于同时设置下面三个
set character_set_client = utf8;
set character_set_results = utf8;
set character_set_connection = utf8;
为什么不用utf8 字符集的选择一般选utf8mb4 不选utf8 因为mysql的utf8不是真正的utf8,比如不支持emoji表情
排序字符集 collation
字符除了需要存储,还需要排序或比较大小。推荐用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也没啥问题。
MySQL 8.0 默认的是 utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种,具体含义如下:
uft8mb4 表示用 UTF-8 编码方案,每个字符最多占4个字节。
0900 指的是 Unicode 校对算法版本。(Unicode归类算法是用于比较符合Unicode标准要求的两个Unicode字符串的方法)。
ai指的是口音不敏感。也就是说,排序时e,è,é,ê和ë之间没有区别。 as指的是口音敏感。
ci结尾表示大小写不敏感(caseinsensitive)。也就是说,排序时p和P之间没有区别。 cs表示大小写敏感(case sensitive)
如果需要区分大小写和口音,则可以使用as_cs
uft8mb4_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
utf8mb4_general_cs 区分大小写,如果用户名和邮箱用这个 就会造成不良后果
utf8mb4_XX_0900_as_cs xx 表示国家或地区
语言 | 编码 |
克罗地亚 | utf8mb4_hr_0900_ai_ci |
捷克 | utf8mb4_cs_0900_ai_ci |
丹麦 | utf8mb4_da_0900_ai_ci |
世界语 | utf8mb4_eo_0900_ai_ci |
爱沙尼亚语 | utf8mb4_et_0900_ai_ci |
德国 | utf8mb4_de_pb_0900_ai_ci |
匈牙利 | utf8mb4_hu_0900_ai_ci |
冰岛的 | utf8mb4_is_0900_ai_ci |
拉脱维亚 | utf8mb4_lv_0900_ai_ci |
立陶宛 | utf8mb4_lt_0900_ai_ci |
抛光 | utf8mb4_pl_0900_ai_ci |
古典拉丁文 | utf8mb4_la_0900_ai_ci |
罗马尼亚 | utf8mb4_ro_0900_ai_ci |
斯洛伐克 | utf8mb4_sk_0900_ai_ci |
斯洛文尼亚 | utf8mb4_sl_0900_ai_ci |
现代西班牙 | utf8mb4_es_0900_ai_ci |
传统西班牙 | utf8mb4_es_trad_0900_ai_ci |
瑞典 | utf8mb4_sv_0900_ai_ci |
土耳其 | utf8mb4_tr_0900_ai_ci |
越南 | utf8mb4_vi_0900_ai_ci |