查看MySQL支持的字符集的两种方式
-
SHOW CHARACTER SET; (可加子查询 LIKE 'utf%';)
-
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支持的排序规则的两种方式:
-
SHOW COLLATION;( 可加子查询WHERE Charset = 'utf8mb4')
-
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 |...
排序规则一般有以下特征:
-
两个不同的字符集不能有相同的排序规则。
-
每个字符集都有一个默认排序规则。例如:utf8mb4的默认utf8mb4_0900_ai_ci
-
排序规则名称以与其关联的字符集的名称开头,通常后跟一个或多个表示其他排序规则特征的后缀。如:utf8mb4的utf8mb4_general_ci
字符集曲目(Character Set Repertoire)
曲目是所有字符的合集,可以有以下两种属性(attribute):
-
ASCII: 表达式只能包含 ASCII 字符;也就是说,Unicode 范围内的字符 U+0000到U+007F.
-
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