查看MySQL支持的字符集的两种方式

  1. SHOW CHARACTER SET; (可加子查询 LIKE 'utf%';)

  2. SELECT * FROM INFORMATION_SCHEMA.CHARACTER_SETS;

mysql> SHOW CHARACTER SET;+----------+---------------------------------+---------------------+--------+| Charset  | Description                     | Default collation   | Maxlen |+----------+---------------------------------+---------------------+--------+| binary   | Binary pseudo charset           | binary              |      1 || latin1   | cp1252 West European            | latin1_swedish_ci   |      1 || utf8mb3  | UTF-8 Unicode                   | utf8mb3_general_ci  |      3 || utf8mb4  | UTF-8 Unicode                   | utf8mb4_0900_ai_ci  |      4 |...

查看MySQL支持的排序规则的两种方式:

  1. SHOW COLLATION;( 可加子查询WHERE Charset = 'utf8mb4')

  2. SELECT * FROM INFORMATION_SCHEMA.COLLATIONS

mysql> SHOW COLLATION WHERE Charset = 'utf8mb4';+----------------------------+---------+-----+---------+----------+---------+---------------+| Collation                  | Charset | Id  | Default | Compiled | Sortlen | Pad_attribute |+----------------------------+---------+-----+---------+----------+---------+---------------+| utf8mb4_0900_ai_ci         | utf8mb4 | 255 | Yes     | Yes      |       0 | NO PAD        || utf8mb4_bin                | utf8mb4 |  46 |         | Yes      |       1 | PAD SPACE     || utf8mb4_general_ci         | utf8mb4 |  45 |         | Yes      |       1 | PAD SPACE     |...

排序规则一般有以下特征:

  1. 两个不同的字符集不能有相同的排序规则。

  2. 每个字符集都有一个默认排序规则。例如:utf8mb4的默认utf8mb4_0900_ai_ci

  3. 排序规则名称以与其关联的字符集的名称开头,通常后跟一个或多个表示其他排序规则特征的后缀。如:utf8mb4的utf8mb4_general_ci

字符集曲目(Character Set Repertoire)
曲目是所有字符的合集,可以有以下两种属性(attribute):

  1. ASCII: 表达式只能包含 ASCII 字符;也就是说,Unicode 范围内的字符 U+0000到U+007F.

  2. UNICODE: 表达式可以包含 Unicode 范围内的U+0000字符 U+10FFFF。包括基本多语言平面 (BMP) 范围 ( U+0000to ) 中的字符和 BMP 范围 ( to )U+FFFF之外的补充字符。 U+10000U+10FFFF
    ASCII是UNICODE的子集,因此ASCII的字符串可以安全地转化为UNICODE字符串

会自动选择合适的曲目

  • 即使强制设置成utf8mb4,但'abc'、'def'都没有超出ASCII范围,因此曲目仍然是ASCII而不是UNICODE

SET NAMES utf8mb4; SELECT 'abc';
SELECT _utf8mb4'def';
  • CHARSET为ascii,则曲目也为ascii

CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET ascii);

报错:Illegal mix of collations

  • 如果排序规则强制规则不足以解决歧义 ,MySQL 会返回 “Illegal mix of collations (XX,XX)”错误

CREATE TABLE t1 (
  c1 CHAR(1) CHARACTER SET latin1,
  c2 CHAR(1) CHARACTER SET ascii);INSERT INTO t1 VALUES ('a','b');SELECT CONCAT(c1,c2) FROM t1;-> ERROR 1267 (HY000): Illegal mix of collations (ascii_general_ci,COERCIBLE)and (latin1_swedish_ci,IMPLICIT) for operation 'concat'-- 如果设置为子集到超集(ascii到latin1),那么可以成功返回结果【这里文档没有提如何设置曲目,没看明白】+---------------+| CONCAT(c1,c2) |+---------------+| ab            |+---------------+
  • 这个问题在TMS中也遇到过几次,不同表上相同含义的列,在一张表上是UTF8、另外一张表上市UTFMB4,此时作Join就会报错,提示我们同一数据库尽量选用同一字符集,排序规则也尽可能地统一

 转自:https://www.jianshu.com/p/de824d80f2c7