10.2.1 字符集库

字符集的全部是字符集中的字符集合。

字符串 table 达式具有一个曲目属性,该属性可以具有两个值:

ASCII范围是UNICODE范围的子集,因此具有ASCII曲目的字符串可以安全地转换,而不会丢失任何具有UNICODE曲目的字符串的信息集。也可以将其安全地转换为ascii字符集的超集的任何字符集。 (所有 MySQL 字符集都是ascii的超集,但swe7除外,后者将一些标点符号重用为瑞典的带重音符号的字符.)

在大多数情况下,当排序规则强制性的规则不足以解决歧义性时,MySQL 否则会返回“非法的排序规则混合”错误,因此使用库可以在 table 达式中进行字符集转换。 (有关强制性的信息,请参阅第 10.8.4 节“table 达式中的排序规则强制性”。)

以下讨论提供了 table 达式及其组成部分的示例,并描述了组成部分的使用如何更改字符串 table 达式求值:

SET NAMES utf8; SELECT 'abc';
SELECT _utf8'def';
SELECT N'MySQL';

尽管在上述每种情况下,字符集均为utf8,但这些字符串实际上并不包含 ASCII 范围以外的任何字符,因此它们的字符集为ASCII而不是UNICODE

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

下面的示例说明在没有库的情况下发生错误的情况下,库可以如何确定结果:

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 (latin1_swedish_ci,IMPLICIT)
and (ascii_general_ci,IMPLICIT) for operation 'concat'

使用库,可以发生子集到超集(asciilatin1)的转换,并返回结果:

+---------------+
| CONCAT(c1,c2) |
+---------------+
| ab            |
+---------------+
FORMAT(numeric_column, 4);

使用库会改变 MySQL 评估以下示例的方式:

SET NAMES ascii;
CREATE TABLE t1 (a INT, b VARCHAR(10) CHARACTER SET latin1);
INSERT INTO t1 VALUES (1,'b');
SELECT CONCAT(FORMAT(a, 4), b) FROM t1;

没有曲目,则会发生此错误:

ERROR 1267 (HY000): Illegal mix of collations (ascii_general_ci,COERCIBLE)
and (latin1_swedish_ci,IMPLICIT) for operation 'concat'

使用曲目时,将返回结果:

+-------------------------+
| CONCAT(FORMAT(a, 4), b) |
+-------------------------+
| 1.0000b                 |
+-------------------------+
CONCAT(_ucs2 X'0041', _ucs2 X'0042')
CONCAT(_ucs2 X'0041', _ucs2 X'00C2')

对于第一个呼叫,指令集为ASCII,因为两个参数都在 ASCII 范围内。对于第二个调用,由于第二个参数在 ASCII 范围之外,因此指令集为UNICODE

IF(column1 < column2, 'smaller', 'greater')

结果库为ASCII,因为两个字符串参数(第二个参数和第三个参数)都具有ASCII个库。即使 table 达式使用字符串值,第一个参数对于结果库也不重要。

首页