### 12.8.3 字符集与函数结果整理

MySQL 有许多返回字符串的运算符和函数。本节回答问题：这样的字符串的字符集和排序规则是什么？

对于接受字符串输入并返回字符串结果作为输出的简单函数，输出的字符集和排序规则与主要输入值的相同。例如，[`上（*`X`*)`](string-functions.html#function_upper)返回具有相同字符串和排序规则的字符串*`X`*.这同样适用于[`指令（）`](string-functions.html#function_instr),[`LCASE()`](string-functions.html#function_lcase),[`降低（）`](string-functions.html#function_lower),[`LTRIM()`](string-functions.html#function_ltrim),[`中（）`](string-functions.html#function_mid),[`重复（）`](string-functions.html#function_repeat),[`代替（）`](string-functions.html#function_replace),[`逆转（）`](string-functions.html#function_reverse),[`正确的（）`](string-functions.html#function_right),[`RPAD()`](string-functions.html#function_rpad),[`RTRIM()`](string-functions.html#function_rtrim),[`声音（）`](string-functions.html#function_soundex),[`子串（）`](string-functions.html#function_substring),[`修剪（）`](string-functions.html#function_trim),[`UCASE()`](string-functions.html#function_ucase)， 和[`上（）`](string-functions.html#function_upper).

笔记

这[`代替（）`](string-functions.html#function_replace)与所有其他函数不同，该函数始终忽略字符串输入的排序规则并执行区分大小写的比较。

如果字符串输入或函数结果是二进制字符串，则该字符串具有`二进制`字符集和排序规则。这可以通过使用[`字符集（）`](information-functions.html#function_charset)和[`整理（）`](information-functions.html#function_collation)两个函数都返回`二进制`对于二进制字符串参数：

```
mysql> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a');
+---------------------+-----------------------+
| CHARSET(BINARY 'a') | COLLATION(BINARY 'a') |
+---------------------+-----------------------+
| binary              | binary                |
+---------------------+-----------------------+
```

对于组合多个字符串输入并返回单个字符串输出的操作，标准 SQL 的“聚合规则”适用于确定结果的排序规则：

-   如果一个显式`整理 *`是`*`发生，使用*`是`*.

-   如果明确`整理 *`是`*`和`整理 *`Z`*`发生，引发错误。

-   否则，如果所有排序规则都是*`是`*， 采用*`是`*.

-   否则，结果没有排序规则。

    例如，与`案例... WHEN a THEN b WHEN b THEN c 整理 *`X`* 结尾`，得到的排序规则是*`X`*.这同样适用于[`联盟`](union.html),[`||`](logical-operators.html#operator_or),[`连接（）`](string-functions.html#function_concat),[`埃尔特（）`](string-functions.html#function_elt),[`最伟大的（）`](comparison-operators.html#function_greatest),[`如果（）`](flow-control-functions.html#function_if)， 和[`至少（）`](comparison-operators.html#function_least).

    对于转换为字符数据的操作，操作产生的字符串的字符集和排序规则由[`字符集连接`](server-system-variables.html#sysvar_character_set_connection)和[`collat​​ion_connection`](server-system-variables.html#sysvar_collation_connection)确定默认连接字符集和排序规则的系统变量（请参阅[第 10.4 节，“连接字符集和排序规则”](charset-connection.html)）。这仅适用于[`BIN_TO_UUID()`](miscellaneous-functions.html#function_bin-to-uuid),[`投掷（）`](cast-functions.html#function_cast),[`转换（）`](mathematical-functions.html#function_conv),[`格式（）`](string-functions.html#function_format),[`十六进制（）`](string-functions.html#function_hex)， 和[`空间（）`](string-functions.html#function_space).

    对于虚拟生成列的表达式，上述原则有一个例外。在这样的表达式中，表字符集用于[`BIN_TO_UUID()`](miscellaneous-functions.html#function_bin-to-uuid),[`转换（）`](mathematical-functions.html#function_conv)， 要么[`十六进制（）`](string-functions.html#function_hex)结果，无论连接字符集如何。

    如果对字符串函数返回的结果的字符集或排序规则有任何疑问，请使用[`字符集（）`](information-functions.html#function_charset)要么[`整理（）`](information-functions.html#function_collation)找出函数：


```
mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER());
+----------------+-----------------+-------------------+
| USER()         | CHARSET(USER()) | COLLATION(USER()) |
+----------------+-----------------+-------------------+
| test@localhost | utf8            | utf8_general_ci   |
+----------------+-----------------+-------------------+
mysql> SELECT CHARSET(COMPRESS('abc')), COLLATION(COMPRESS('abc'));
+--------------------------+----------------------------+
| CHARSET(COMPRESS('abc')) | COLLATION(COMPRESS('abc')) |
+--------------------------+----------------------------+
| binary                   | binary                     |
+--------------------------+----------------------------+
```
