字符集

-- 查询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)
  1. character_set_client  客户端数据使用的字符集                                                                                                                          MySQL Client发送给mysqld的语句或数据使用字符集。
  2. character_set_connection   连接层字符集                                                                                                                                  其实很多人对这个字符集一脸懵逼,这个字符集与character_set_client有啥区别呢?                                                                  这个字符集用于没有introducer修饰的字符串和数字到字符串的转换。                                                                                        由introducer修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。
  3. character_set_database     数据库字符集                                                                                                                                  MySQL可以给实例下不同数据库单独设置各自的字符集。这个跟SQL Server是类似的。
  4. character_set_filesystem 文件系统字符集                                                                                                                                该变量用于解释引用文件名的字符串文字,例如在LOAD DATA INFILE和SELECT ... INTO OUTFILE语句和LOAD_FILE()函数中。 在文件打开尝试发生之前,这样的文件名将从character_set_client转换为character_set_filesystem。 默认值为二进制,这意味着不会发生转换。 对于允许多字节文件名的系统,不同的值可能更合适。例如,如果系统使用UTF-8表示文件名,则将character_set_filesystem设置为“utf8”。
  5. character_set_results      查询结果字符集                                                                                                                                 mysqld 在返回查询结果集或者错误信息到客户端时,使用的编码字符集
  6. character_set_server       服务器字符集,默认的字符集                                                                                                             服务器级别(实例级别) 的字符集。如果创建数据库时,不指定字符集,那么就会默认使用服务器的编码字符集。
  7. character_set_system       系统元数据字符集                                                                                                                            它是系统元数据((表|字段)名等)存储时使用的编码字符集,该字段和具体存储的数据无关。总是固定不变的UTF8字符集。
  8. 另外,之前的版本还有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.  同上查询表的字符集(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)

修改字符集

  1. 修改字段
ALTER TABLE table_name MODIFY cloumn_name VARCHAR(50) CHARACTER SET utf8mb4 ;
  1. 修改系统变量 (当前环境生效,见3注意)
set character_set_database=utf8mb4;
set global character_set_database=utf8mb4;
  1. 修改mysql 服务器字符集
set global character_set_server=utf8mb4;

注意,上述命令只对当前环境生效,如果没有在my.cnf设置系统变量character_set_server,那么MySQL服务重启后,就会失效。所以一般在my.cnf配置文件设置系统变量character_set_server。对于系统变量character_set_database也是如此。

  1. 修改客户端字符集
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