- 带有 USING 子句的 CONVERT() 可以在字符集之间转换数据:
语法
CONVERT(expr USING transcoding_name)
- 在 MySQL 中,转码名称与对应的字符集名称相同。
示例
SELECT CONVERT('test' USING utf8mb4);
SELECT CONVERT(_latin1'Müller' USING utf8mb4);
INSERT INTO utf8mb4_table (utf8mb4_column)
SELECT CONVERT(latin1_column USING utf8mb4) FROM latin1_table;
- 要在字符集之间转换字符串,也可以使用 CONVERT(expr, type) 语法(不带 USING),或者 CAST(expr AS type),他们是等价的
语法
CONVERT(string, CHAR[(N)] CHARACTER SET charset_name)
CAST(string AS CHAR[(N)] CHARACTER SET charset_name)
示例
SELECT CONVERT('test', CHAR CHARACTER SET utf8mb4);
SELECT CAST('test' AS CHAR CHARACTER SET utf8mb4);
- 如果您指定 CHARACTER SET charset_name,则结果的字符集和排序规则为 charset_name 和 charset_name 的默认排序规则。
- 如果省略 CHARACTER SET charset_name,则结果的字符集和排序规则由确定默认连接字符集和排序规则的 character_set_connection 和 collation_connection 系统变量定义
- CONVERT() 或 CAST() 调用中不允许使用 COLLATE 子句,但您可以将其应用于函数结果。
- 合法的:
SELECT CONVERT('test' USING utf8mb4) COLLATE utf8mb4_bin;
SELECT CONVERT('test', CHAR CHARACTERSET utf8mb4) COLLATE utf8mb4_bin;
SELECT CAST('test' AS CHAR CHARACTERSET utf8mb4) COLLATE utf8mb4_bin;
- 非法的:
SELECT CONVERT('test' USING utf8mb4 COLLATE utf8mb4_bin);
SELECT CONVERT('test', CHAR CHARACTERSET utf8mb4 COLLATE utf8mb4_bin);
SELECT CAST('test' AS CHAR CHARACTERSET utf8mb4 COLLATE utf8mb4_bin);
- 对于字符串文字,另一种指定字符集的方法是使用字符集介绍器。上例中的 _latin1 和 _latin2 是介绍人的实例。与转换函数(例如 CAST() 或 CONVERT() 将字符串从一个字符集转换为另一个字符集)不同,引入者将字符串文字指定为具有特定字符集,而不涉及转换。了解更多信息
字符串比较的字符集转换
- 通常,您不能以不区分大小写的方式比较 BLOB 值或其他二进制字符串,因为二进制字符串使用二进制字符集,它与字母大小写的概念没有排序规则。
- 要执行不区分大小写的比较,首先使用 CONVERT() 或 CAST() 函数将值转换为非二进制字符串。结果字符串的比较使用其排序规则。
- 例如,如果转换结果排序规则不区分大小写,则 LIKE 操作不区分大小写。以下操作确实如此,因为默认的 utf8mb4 排序规则 (utf8mb4_0900_ai_ci) 不区分大小写:
示例
SELECT 'A' LIKE CONVERT(blob_col USING utf8mb4) FROM tbl_name;
- 要为转换后的字符串指定特定的排序规则,请在 CONVERT() 调用之后使用 COLLATE 子句
示例
SELECT 'A' LIKE CONVERT(blob_col USING utf8mb4) COLLATE utf8mb4_unicode_ci FROM tbl_name;
- 要使用不同的字符集,请在前面的语句中将其名称替换为 utf8mb4(类似地使用不同的排序规则)
- CONVERT() 和 CAST() 可以更普遍地用于比较以不同字符集表示的字符串。例如,比较这些字符串会导致错误,因为它们具有不同的字符集
示例
mysql> SET @s1 = _latin1 'abc', @s2 = _latin2 'abc';
mysql> SELECT @s1 = @s2;
ERROR 1267 (HY000):Illegal mix of collations (latin1_swedish_ci,IMPLICIT)
and
(latin2_general_ci,IMPLICIT) for operation '='
- 将其中一个字符串转换为与另一个兼容的字符集可以使比较无误地进行
示例
mysql> SELECT @s1 = CONVERT(@s2 USING latin1);
+------------------------------------------+
|@s1 = CONVERT(@s2 USING latin1) |
+------------------------------------------+
| 1 |
+------------------------------------------+
- 字符集转换在二进制字符串的字母大小写转换之前也很有用。当直接应用于二进制字符串时,LOWER() 和 UPPER() 无效,因为字母大小写的概念不适用。要执行二进制字符串的字母大小写转换,首先使用适合存储在字符串中的数据的字符集将其转换为非二进制字符串:
示例
mysql> SET @str = BINARY 'New York';
mysql> SELECT LOWER(@str), LOWER(CONVERT(@str USING utf8mb4)); +------------------+---------------------------------------------------+
| LOWER(@str) | LOWER(CONVERT(@str USING utf8mb4)) |
+------------------+---------------------------------------------------+
| New York | new york |
+------------------+---------------------------------------------------+
注
请注意,如果将BINARY、CAST()或CONVERT()应用于索引列,MySQL可能无法有效地使用索引。
来自 < https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html>