mysql 字符集 排序规则

字符集

-- 查询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)

查询表的字符集

  1. show create table sys_user;  
    -- (当前数据库)
     Table    Create Table  
    sys_userCREATE 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
  2. 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;  
  2. 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 ;   
  2. 修改系统变量 (当前环境生效,见3注意)
    set character_set_database=utf8mb4;
    set global character_set_database=utf8mb4;
  3. 修改mysql 服务器字符集

    set global character_set_server=utf8mb4;

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

  4. 修改客户端字符集

    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值