MySQL 函数和运算符:转换函数和运算符
强制转换函数和运算符:
Name | Description |
---|---|
BINARY | 将字符串转换为二进制字符串 |
CAST() | 将值强制转换为特定类型【用法:“CONVERT(expr USING transcoding_name)”或“CONVERT(expr, type)”】 |
CONVERT() | 将值强制转换为特定类型【用法:“CAST(expr AS type)”】 |
- 强制转换函数和运算符可将值从一种数据类型转换为另一种数据类型。
- 如果使用“BINARY”,“CAST()”或“CONVERT()”转换索引列,则 MySQL 可能无法有效使用索引。
带有“USING”子句的“CONVERT()”在不同字符集之间转换数据:
CONVERT(expr USING transcoding_name)
- 在 MySQL 中,转码名称与相应的字符集名称相同。如:
SELECT CONVERT('test' USING utf8); SELECT CONVERT(_latin1'Müller' USING utf8); INSERT INTO utf8_table (utf8_column) SELECT CONVERT(latin1_column USING utf8) FROM latin1_table;
要在不同的字符集之间转换字符串,还可以使用(不带“USING”的)“CONVERT(expr, type)”语法或“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 utf8);
SELECT CAST('test' AS CHAR CHARACTER SET utf8);
“CONVERT()”或“CAST()”调用中不允许使用“COLLATE”子句,但可以将其应用于函数结果。
- 例如,这些是合法的:
SELECT CONVERT('test' USING utf8) COLLATE utf8_bin; SELECT CONVERT('test', CHAR CHARACTER SET utf8) COLLATE utf8_bin; SELECT CAST('test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
- 但是这些是非法的:
SELECT CONVERT('test' USING utf8 COLLATE utf8_bin); SELECT CONVERT('test', CHAR CHARACTER SET utf8 COLLATE utf8_bin); SELECT CAST('test' AS CHAR CHARACTER SET utf8 COLLATE utf8_bin);
通常,不能以不区分大小写的方式比较“BLOB”值或其他二进制字符串,因为二进制字符串使用“binary”字符集,该字符集与字母大小写的概念没有任何关联。要执行不区分大小写的比较,请首先使用“CONVERT()”或“CAST()”函数将值转换为非二进制字符串。结果字符串的比较使用其排序规则。【如,中文拼音排序】
- 例如,如果转换结果字符集具有不区分大小写的排序规则,则“LIKE”操作不区分大小写。对于以下操作,这是正确的,因为默认的“latin1”排序规则(“latin1_swedish_ci”)不区分大小写:
SELECT 'A' LIKE CONVERT(blob_col USING latin1) FROM tbl_name;
- 要为转换后的字符串指定特定的排序规则,请在“CONVERT()”调用之后使用“COLLATE”子句:
SELECT 'A' LIKE CONVERT(blob_col USING latin1) COLLATE latin1_german1_ci FROM tbl_name;
若要使用其他字符集,请在前面的语句中用其名称替换latin1(并类似地使用其他排序规则)。
字符集转换在二进制字符串的字母大写转换之前也很有用。直接应用于二进制字符串时,LOWER() 和 UPPER() 无效,因为字母大小写的概念不适用。要执行二进制字符串的字母大小写转换,请首先使用适合于存储在字符串中的数据的字符集将其转换为非二进制字符串:
mysql> SET @str = BINARY 'New York'; mysql> SELECT LOWER(@str), LOWER(CONVERT(@str USING latin1)); +-------------+-----------------------------------+ | LOWER(@str) | LOWER(CONVERT(@str USING latin1)) | +-------------+-----------------------------------+ | New York | new york | +-------------+-----------------------------------+
请注意,如果使用 BINARY,CAST() 或 CONVERT() 转换索引列,则 MySQL 可能无法有效使用索引。
对于时间值,几乎不需要使用“CAST()”来提取不同格式的数据。而是使用“EXTRACT()”,“DATE_FORMAT()”或“TIME_FORMAT()”之类的函数。
MySQL 支持带符号和无符号 64 位值的算术运算。对于其中一个操作数是无符号整数的数字运算符(例如+或-),默认情况下结果是无符号的(请参见第 12.5.1 节“算术运算符”)。要覆盖此内容,请使用“SIGNED”或“UNSIGNED”强制转换运算符将值分别强制转换为有符号或无符号 64 位整数。
mysql> SELECT 1 - 2; -> -1 mysql> SELECT CAST(1 - 2 AS UNSIGNED); -> 18446744073709551615 mysql> SELECT CAST(CAST(1 - 2 AS UNSIGNED) AS SIGNED); -> -1
如果任何一个操作数都是浮点值,则结果是浮点值,并且不受前面的规则的影响。 (在这种情况下,“DECIMAL”列值被视为浮点值。)
mysql> SELECT CAST(1 AS UNSIGNED) - 2.0; -> -1.0
SQL 模式会影响转换操作的结果。例子:
- 为了将“零”日期字符串转换为日期,“CONVERT()”和“CAST()”返回“NULL”并在启用“NO_ZERO_DATE” SQL 模式时产生警告。
- 对于整数减法,如果启用了“NO_UNSIGNED_SUBTRACTION” SQL 模式,则即使任何操作数都为无符号数,减法结果都是有符号数。