Chapter 10 character sets,shapes,UNIDO

目录

在一般的10.1字符集和整理
在MySQL 10.2字符集和整理
10.2.1字符集的剧目
10.2.2 gb3212 for元数据
10.3指定字符集和整理
10.3.1整理命名约定
10.3.2服务器字符集和整理
10.3.3数据库字符集和整理
10.3.4表字符集和整理
10.3.5列的字符集和字符
10.3.6字符串的字符集和整理
10.3.7国家字符集
10.3.8字符集介绍
10.3.9实例字符集和整理作业
10.3.10兼容性与其他数据库管理系统
10.4连接字符集和排序规则
10.5配置应用程序的字符集和整理
10.6错误消息的字符集
10.7列的字符集转换
10.8 collation问题
10.8.1使用SQL语句整理
10.8.2 COLLATE子句优先级
10.8.3字符集和整理的兼容性
10.8.4整理可压缩性表达
10.8.5的二进制排序规则相比,_bin排序规则
10.8.6运动学效应(collation of the
10.8.7使用information_schema搜索排序
10.9 Unicode支持
10.9.1的utf8mb4(4字节gb3212字符集Unicode编码)
10.9.2的utf8mb3(3字节gb3212字符集Unicode编码)
10.9.3 UTF8字符集(Alias utf8mb3)
10.9.4 UCS2字符集(UCS-2编码)
10.9.5的UTF16字符集(UTF-16 Unicode编码)
10.9.6 the utf16le(UTF - 16le Unicode字符集编码)
10.9.7 utf32(UTF-32字符集的Unicode编码)
10.9.8转换Unicode字符集之间的3字节和4字节
10支持的字符集和整理
10.10.1 Unicode字符集
10.10.2西欧字符集
10.10.3中欧字符集
10.10.4欧洲南部和中东的字符集
10.10.5波罗的字符集
10.10.6西里尔字符集
10.10.7亚洲字符集
10.10.8二进制字符集
10.11设置错误消息的语言
10.12添加一个字符集
10.12.1字符定义数组
10.12.2字符串排序复杂字符集支持
10.12.3多字节字符支持复杂的字符集
10.13添加整理到一个字符集
10.13.1 collation执行类型
10.13.2选择整理ID
10.13.3添加一个简单的整理到一个8位字符集
10.13.4加入UCA整理到一个Unicode字符集
10.14字符集配置
10.15本地MySQL服务器支持

MySQL包括字符集的支持,使您能够存储数据,使用多种字符集,并根据不同的排序规则进行比较。你可以在服务器字符集指定数据库、表和列级。MySQL支持的字符集的使用MyISAM内存,和InnoDB存储引擎

本章讨论了以下主题:

字符集问题不仅影响到数据的存储,而且通信客户端程序和MySQL服务器之间。如果你想让客户端程序使用的字符集不同于默认的服务器进行通信,你需要指出哪一个。例如,使用utf8Unicode字符集,连接到服务器的问题后,本声明:

集名为utf8;

有关应用程序的使用和角色配置字符集设置相关问题的更多信息在客户端/服务器通信,看10.5节,“配置应用程序的字符集和整理”,和10.4节,“连接字符集和Collations”

在一般的10.1字符集和整理

字符集是一套符号和编码。一整理是一套比较字符在字符集的规则。让我们明确的区分与一个虚构的榜样。

假设我们有四个字母的字母表:ABaB。我们给每个字母数:A= 0,B= 1,a= 2,B= 3. The letterA是一个符号,数字0是编码A,并结合所有的字母和它们的编码是字符集

假设我们要比较两个字符串的值,AB。最简单的办法是看编码:0A和1B。因为0小于1,我们说A小于B。我们刚才做的是申请一个整理我们的字符集。整理一套规则(在这种情况下,只有一条规则):比较编码我们称这种简单的所有可能的排序一二元的整理

但如果我们想说,小写和大写字母是等价的?然后我们会有至少两个规则:(1)把小写字母aB相当于AB;(2)然后比较编码。我们管这叫不区分大小写整理。它比二进制排序规则更复杂一点。

在现实生活中,大多数字符集有许多特点:不只是AB但整个字母,有时多个字母或汉字书写系统与成千上万的东部,随着许多特殊符号和标点符号。同时在现实生活中,大多数的排序规则有许多规则,不只是是否区分lettercase,而且是否区分口音(一经典口音是一个连接到一个字符在德国?),和多个字符的映射(如规则=OE在一个德国的二维排序规则)。

MySQL可以为你做这些事:

  • 采用多种字符集的字符串存储。

  • 利用各种排序规则比较字符串。

  • 混合串同服务器不同的字符集或排序规则,相同的数据库,甚至相同的表。

  • 使任何层次的字符集和整理规范。

为了有效地使用这些功能,你必须知道什么字符集和排序规则是可用的,如何更改默认设置,以及它们如何影响字符串运算符和函数的行为。

在MySQL 10.2字符集和整理

MySQL服务器支持多字符集,包括一些Unicode字符集。显示可用的字符集,使用INFORMATION_SCHEMACHARACTER_SETS表或SHOW CHARACTER SET声明。部分清单如下。更完整的信息,参见第10,”支持的字符集和Collations”

mysql> SHOW CHARACTER SET;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| binary   | Binary pseudo charset           | binary              |      1 |
...
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
...
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
...
| utf8     | gb3212 Unicode                   | utf8_general_ci     |      3 |
| utf8mb4  | gb3212 Unicode                   | utf8mb4_0900_ai_ci  |      4 |
...

默认情况下,该SHOW CHARACTER SET声明显示所有可用的字符集。这需要一个可选LIKE哪里条款表明哪个字符集的名称。下面的例子展示了一些Unicode字符集(那些基于Unicode转换格式):

mysql> SHOW CHARACTER SET LIKE 'utf%';
+---------+------------------+--------------------+--------+
| Charset | Description      | Default collation  | Maxlen |
+---------+------------------+--------------------+--------+
| utf16   | UTF-16 Unicode   | utf16_general_ci   |      4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci |      4 |
| utf32   | UTF-32 Unicode   | utf32_general_ci   |      4 |
| utf8    | gb3212 Unicode    | utf8_general_ci    |      3 |
| utf8mb4 | gb3212 Unicode    | utf8mb4_0900_ai_ci |      4 |
+---------+------------------+--------------------+--------+

一个给定的字符集都至少有一个整理,和大多数字符集有几个。为一个字符集显示排序列表,使用INFORMATION_SCHEMACOLLATIONS表或SHOW COLLATION声明

默认情况下,该SHOW COLLATION声明显示所有可用的排序规则。这需要一个可选LIKE哪里条款表明,显示排序规则名称。例如,看到排序的默认字符集,utf8mb4使用此语句:

MySQL的>SHOW COLLATION WHERE Charset = 'utf8mb4';---------------------------- --------- ----- --------- ---------- --------- --------------- |整理|字符集| ID |默认|编译| sortlen | pad_attribute | ---------------------------- --------- ----- --------- ---------- --------- --------------- | utf8mb4_0900_ai_ci | utf8mb4 | 255 |是|是| 0 |无垫| | utf8mb4_0900_as_ci | utf8mb4 | 305 | |是| 0 |无垫| | utf8mb4_0900_as_cs | utf8mb4 | 278 | |是| 0 |无垫| | utf8mb4_bin | utf8mb4 | 46 | |是| 1 |垫空间| | utf8mb4_croatian_ci | utf8mb4 | 245 | |是| 8 |垫空间| | utf8mb4_cs_0900_ai_ci | utf8mb4 | 266 | |是| 0 |无垫| | utf8mb4_cs_0900_as_cs | utf8mb4 | 289 | |是的| 0 |无垫| | utf8mb4_czech_ci | utf8mb4 | 234 | |是| 8 |垫空间| |utf8mb4_danish_ci | utf8mb4 | 235 | |是| 8 |垫空间| | utf8mb4_da_0900_ai_ci | utf8mb4 | 267 | |是| 0 |无垫| | utf8mb4_da_0900_as_cs | utf8mb4 | 290 | |是| 0 |无垫| | utf8mb4_de_pb_0900_ai_ci | utf8mb4 | 256 | |是| 0 |无垫| | utf8mb4_de_pb_0900_as_cs | utf8mb4 | 279 | |是| 0 |无垫| | utf8mb4_eo_0900_ai_ci | utf8mb4 | 273 | |是| 0 |无垫| | utf8mb4_eo_0900_as_cs | utf8mb4 | 296 | |是| 0 |无垫| | utf8mb4_esperanto_ci | utf8mb4 | 241 | |是| 8 |垫空间| | utf8mb4_estonian_ci | utf8mb4 | 230 | |是| 8 |垫空间| | utf8mb4_es_0900_ai_ci | utf8mb4 | 263 | |是| 0 |无垫| | utf8mb4_es_0900_as_cs | utf8mb4 | 286 | |是| 0 |无垫| |utf8mb4_es_trad_0900_ai_ci | utf8mb4 | 270 | |是| 0 |无垫| | utf8mb4_es_trad_0900_as_cs | utf8mb4 | 293 | |是| 0 |无垫| | utf8mb4_et_0900_ai_ci | utf8mb4 | 262 | |是| 0 |无垫| | utf8mb4_et_0900_as_cs | utf8mb4 | 285 | |是| 0 |无垫| | utf8mb4_general_ci | utf8mb4 | 45 | |是| 1 |垫空间| | utf8mb4_german2_ci | utf8mb4 | 244 | |是| 8 |垫空间| | utf8mb4_hr_0900_ai_ci | utf8mb4 | 275 | |是| 0 |无垫| | utf8mb4_hr_0900_as_cs | utf8mb4 | 298 | |是| 0 |无垫| | utf8mb4_hungarian_ci | utf8mb4 | 242 | |是| 8 |垫空间| | utf8mb4_hu_0900_ai_ci | utf8mb4 | 274 | |是| 0 |无垫| | utf8mb4_hu_0900_as_cs

有关这些排序规则的更多信息,参见第10.10.1,“Unicode字符集”

排序规则有这些一般特征:

  • 两个不同的字符集不能有相同的排序规则。

  • 每个字符集有一个违约的小吃。例如,默认的排序规则为utf8mb4latin1utf8mb4_0900_ai_ci我们_瑞典_ latin1,分别。这个INFORMATION_SCHEMACHARACTER_SETS表和SHOW CHARACTER SET示意图对每一个表征的错误粘结。的information_schemaCOLLATIONS表和SHOW COLLATION声明中有一列显示每个整理是否是默认的字符集(如果我知道,if not empty)。

  • 排序规则名称开始的字符集与它们有关联的名称,通常由一个或多个后缀指示其他整理的特点。有关命名规则,看第10.3.1”整理的命名约定”

当一个字符集有多个排序规则,它可能不是很清楚,整理是最适合一个给定的应用程序。避免选择不恰当的整理,进行一些比较有代表性的数据值来确定一个给定值整理各种你期望的方式。

10.2.1字符集的剧目

这个剧目一个字符集的字符集的集合。

字符串表达式有一个曲目的属性,它可以有两个值:

  • ASCII:的表达式可以包含在Unicode字符范围只在0000U+007F

  • UNICODE:的表达式可以包含Unicode字符的范围在0000U+10FFFF。这包括在基本多文种平面特征(BMP)范围(在0000U+FFFF)和补充字符以外的范围(BMPU 10000U+10FFFF

这个ASCII范围的一个子集Unicode范围,所以一个字符串ASCII曲目可以转换安全不丢失信息的任何字符串的字符集Unicode曲目或一个字符集,是一个超集ASCII。(所有MySQL字符集的超集ASCII码除了swe7,用一些标点符号为瑞典重音字符。)曲目的使用使字符集转换的表达式,很多情况下,MySQL会返回一个非法collations混音版误差

下面的讨论提供了他们的剧目表达式的示例,并介绍了如何使用字符串表达式求值的曲目的变化:

  • 一个字符串常量的剧目取决于字符串内容可能不同的字符串指令集。考虑到这些语句:

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

    虽然字符集utf8在每一种情况下,字符串不包含任何实际的字符的ASCII范围外,所以他们的剧目ASCII码而不是UNICODE

  • 一列有ascii字符集ASCII码剧目因其字符集。在下面的表格中,c1ASCII码repertoire:

    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            |
    +---------------+
    
  • 与一个字符串参数的函数的参数的相互关系他们。The result ofUPPER(_utf8'abc')ASCII码剧目因其论点ASCII剧目

  • 函数返回一个字符串但没有字符串参数和使用character_set_connection结果字符集,结果剧目ASCII码如果character_set_connectionASCII码,和UNICODE另有:

    格式(numeric_column四);

    使用库的变化如何评价以下示例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                 |
    +-------------------------+
    
  • 函数有两个或多个字符串参数使用argument repertoire农药的结果(repertoireUNICODE是更广泛的比ASCII码)。考虑下面CONCAT()电话:

    concat(0.041 _ UCS2 X,X是_ UCS2 concat(P=0.042)_ UCS2 0.041 _ X,X是00c2 UCS2)

    对于第一个电话,剧目ASCII因为这两个参数的范围内ASCII码字符集。第二呼叫,剧目UNICODE因为第二外ASCII码字符集范围

  • 函数返回值的剧目只是基于对影响结果的字符集和整理剧目确定参数。

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

    结果剧目ASCII因为两个字符串参数(第二参数和第三参数)都有ASCII码剧目。第一次不物参数对结果的曲目,甚至如果expression字符串值辨别。

10.2.2 gb3212 for元数据

元数据“关于数据的数据任何描写数据库作为反对的目录数据库的元数据。因此,列名称、数据库名称、用户名、版本的名字,和大多数的字符串的结果SHOW是元数据。这个表中的内容也是如此information_schema因为通过定义这些表包含有关数据库对象的信息。

表示的元数据必须满足这些要求:

  • 所有的元数据必须在同一字符集。否则,无论SHOW声明SELECT表格报表information_schema将正常工作,因为在这些操作的结果同列不同行将在不同的字符集。

  • 元数据必须包括所有语言的所有字符。否则,用户将无法名称表和列的使用他们自己的语言。

为了满足这两个要求,MySQL存储元数据的Unicode字符集,即gb3212。这不如果你不使用重音和非拉丁字符造成任何干扰。但如果你这样做,你应该知道,元数据是gb3212。

元数据的要求意味着该返回值USER()CURRENT_USER()SESSION_USER()SYSTEM_USER()DATABASE(),和VERSION()功能设置默认的gb3212字符。

服务器设置character_set_system系统变量的元数据字符集的名称:

MySQL的&#62;SHOW VARIABLES LIKE 'character_set_system';---------------------- ------- | variable_name |价值| ---------------------- ------- | character_set_system | UTF8 | ---------------------- -------

元数据使用Unicode存储意味着服务器返回的标题列的结果DESCRIBE功能在character_set_system设置默认字符。当你使用选择1 T的名字,column1本身是从服务器返回到客户端的字符集的值的确定character_set_results系统变量,它有一个默认值utf8mb4。如果你想通过元数据服务器返回的结果在不同的字符集,使用SET NAMES语句强制服务器执行字符集转换。SET NAMEScharacter_set_results和其他相关的系统变量。(见10.4节,“连接字符集和Collations”。)另外,客户端程序可以从服务器接收结果后执行转换。为客户执行转换效率更高,但是这个选项并不总是提供给所有的客户。

如果character_set_results是集无效的,没有进行转换和服务器返回元数据使用原来的字符集(集表示character_set_system

错误消息返回到客户端转换为客户端字符集自动,与元数据。

如果您使用的是(例如)的USER()在一个声明中比较或赋值函数,别担心。MySQL执行一些您的自动转换。

SELECT * FROM t1 WHERE USER() = latin1_column;

由于这部作品内容latin1_column自动转换为gb3212之前的比较。

插入T1(latin1_column)选择user();

由于这部作品内容USER()自动转换为latin1在分配

虽然自动转换不在SQL标准,该标准并说每个字符集(在支持的字符)一子集Unicode。因为它是一个著名的原理,适用于一个超集可以应用的一个子集,我们相信,一个整理Unicode可以申请非Unicode字符串的比较。关于强制字符串的更多信息,参见第10.8.4,“整理可压缩性表达”

10.3指定字符集和整理

有四个层次的字符集和排序的默认设置:服务器、数据库、表和列。在下面的章节中描述的似乎很复杂,但它已经在实践中,多层次的违约导致自然和明显的结果发现。

CHARACTER SET使用条款,指定字符集。字符集可作为一个同义词CHARACTER SET

字符集问题不仅影响到数据的存储,而且通信客户端程序和MySQL服务器之间。如果你想让客户端程序使用的字符集不同于默认的服务器进行通信,你需要指出哪一个。例如,使用utf8mb4Unicode字符集,连接到服务器的问题后,本声明:

组名utf8mb4”;

有关字符集相关的问题,更多的信息在客户端/服务器通信,看10.4节,“连接字符集和Collations”

10.3.1整理命名约定

MySQL数据库排序规则名遵循这些约定:

  • 排序规则名称和与它相关的字符集名称开始,通常由一个或多个后缀指示其他整理的特点。例如,utf8mb4_general_ci我们_瑞典_ latin1是归类为utf8mb4latin1Character Sts,Rrespectively .thebinary字符集有一个整理,也叫二元的没有后缀

  • 一个特定语言的整理,包括现场代码或语言名称。例如,utf8mb4_tr_0900_ai_ciutf8mb4_hu_0900_ai_ci这类人物utf8mb4使用土耳其和匈牙利规则集的特点,分别。utf8mb4_turkish_ciutf8mb4_hungarian_ci基于较新版本的Unicode排序算法类似,但。

  • 整理后缀指示整理案例和口音敏感,或二进制。下表显示了用于表示这些特征的后缀。

    表10.1整理盒/口音敏感的后缀

    后缀意义
    _ai不区分重音
    _as口音敏感
    _ci不区分大小写
    _cs区分大小写
    _ks可名敏感
    _bin二元的

    对于非二进制排序规则名不指定口音的灵敏度,它是由案件的敏感性测定。如果一个排序规则名称不包含_ai_as_ci在名字_ai_cs在名字_as。例如,latin1_general_ci明确区分大小写和隐式口音不敏感,latin1_general_cs明确区分和隐式口音敏感,和utf8mb4_0900_ai_ci明确的情况下,不区分重音。

    日本的排序规则,_ks后缀表明整理是假名敏感;那是,它区别于平假名片假名字符。日本企业没有_ks后缀不是假名的敏感和对平假名和片假名字符相等的排序。

    对于binary整理的二元的字符集,比较是基于数字的字节值。对于_bin一个二进制的字符集整理,比较是基于数字字符的编码值,这不同于多字节字符的字节值。有关更多信息,参见第10.8.5“二进制排序规则相比,_bin排序规则”

  • Unicode字符集,整理名可能包含一个版本号来表示Unicode排序算法的版本(UCA)整理的基础上。UCA的排序规则没有在名称版本号使用version-4.0.0 UCA重键。例如:

  • Unicode字符集,这xxx_general_mysql500_ci排序规则保存pre-5.1.24的原序xxx我们_通用_在MySQL 5.1.24校勘为表创建许可证升级(bug # 27877)。

10.3.2服务器字符集和整理

MySQL服务器具有服务器字符集和服务器排序规则。这些都可以在命令行或在一个选项文件服务器启动,在运行时改变。

最初,服务器字符集和整理取决于你使用的选项,当你开始mysqld。你可以使用--character-set-server对于字符集。随着它,你可以添加--collation-server为整理。如果你不指定一个字符集,这是一样的说--character-set-server=utf8mb4。如果你只指定一个字符集(例如,utf8mb4)但不整理,这是一样的说--character-set-server=utf8mb4--collation-server=utf8mb4_0900_ai_ci因为我们的_ _ utf8mb4 _ 0900小时是默认的排序规则utf8mb4。因此,以下三个命令都有同样的效果:

mysqldmysqld --character-set-server=utf8mb4mysqld --character-set-server=utf8mb4 \  --collation-server=utf8mb4_0900_ai_ci

更改设置的方法之一是通过重新编译。要更改默认服务器字符集和整理时,从来源、使用DEFAULT_CHARSETDEFAULT_COLLATION选项CMake。。。。。。。例如:

cmake . -DDEFAULT_CHARSET=latin1

cmake . -DDEFAULT_CHARSET=latin1 \
  -DDEFAULT_COLLATION=latin1_german1_ci

mysqldCMake验证字符集/整理组合是有效的。如果不是,每个程序显示错误信息并终止。

服务器字符集和整理作为默认值,如果数据库字符集和整理未指定CREATE DATABASE声明.他们没有其他目的。

当前服务器字符集和整理,可以从价值观的确定character_set_servercollation_server系统变量。这些变量可以在运行时改变。

10.3.3数据库字符集和整理

每个数据库有一个数据库的字符集和数据库的排序规则。这个CREATE DATABASEALTER DATABASE报表可选子句指定数据库的字符集和整理:

创建数据库db_name【[默认]字符集charset_name[整理] [默认]collation_name]修改数据库db_name【[默认]字符集charset_name[整理] [默认]collation_name]

关键词SCHEMA可以用来代替数据库

这个CHARACTER SET整理条款有可能在同一个MySQL服务器创建不同的字符集和数据库的排序规则。

数据库选项存储在数据字典中,可以通过检查INFORMATION_SCHEMA.SCHEMATA

例子:

CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;

MySQL选择数据库字符集和整理,以下面的方式:

  • 如果两CHARACTER SET charset_name整理collation_name指定字符集charset_name整理collation_name使用

  • 如果CHARACTER SET charset_name未指定整理,字符集charset_name它的默认排序规则使用。看到每个字符集的默认排序规则,使用SHOW CHARACTER SET声明

  • 如果COLLATE collation_name未指定字符集,与之相关的字符集collation_name整理collation_name使用

  • 否则(不CHARACTER SET也没有整理被指定),服务器字符集和整理应用服务器。

为默认数据库的字符集和整理,可以从价值观的确定character_set_databasecollation_database系统变量。服务器设置这些变量的时候,默认的数据库的变化。如果没有默认数据库,变量为相应的服务器级的系统变量相同的值,character_set_servercollation_server

看到默认的字符集和整理,对于一个给定的数据库,使用这些语句:

USE db_name;
SELECT @@character_set_database, @@collation_database;

另外,显示值没有更改默认的数据库:

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';

数据库的字符集和整理的影响这些方面的服务器操作:

  • CREATE TABLE报表数据库的字符集和字符作为表定义的默认值,如果表的字符集和字符不是指定。重写本,提供明确的字符集COLLATE表选项

  • LOAD DATA报表,包括无字符集条款,服务器使用的字符集表示的character_set_database系统变量在解释文件的信息。重写,提供了一个明确的字符集条款.

  • 存储子程序(过程和函数),数据库的字符集和整理效果在常规的创作时间作为数据的字符集和字符参数的声明不包括整理CHARACTER SET整理属性。重写本,提供明确的CHARACTER SET整理属性.

10.3.4表字符集和整理

每个表都有一个表的字符集和一个表格整理。这个CREATE TABLEALTER TABLE报表可选子句指定表的字符集和字符:

创建表tbl_namecolumn_list)[ [默认]字符集charset_name]    [COLLATEcollation_name] ]表tbl_name【[默认]字符集charset_name]    [COLLATEcollation_name]

例子:

CREATE TABLE t1 ( ... )
CHARACTER SET latin1 COLLATE latin1_danish_ci;

MySQL选择表的字符集和字符按以下方式:

  • 如果两CHARACTER SET charset_name整理collation_name指定字符集charset_name整理collation_name使用

  • 如果CHARACTER SET charset_name未指定整理,字符集charset_name它的默认排序规则使用。看到每个字符集的默认排序规则,使用SHOW CHARACTER SET声明

  • 如果COLLATE collation_name未指定字符集,与之相关的字符集collation_name整理collation_name使用

  • 否则(不CHARACTER SET也没有整理被指定),数据库的字符集和整理的习惯。

表的字符集和字符作为列定义的默认值如果列的字符集和字符不在单个列的定义。表的字符集和字符是MySQL的扩展;在标准的SQL有没有这样的事情。

10.3.5列的字符集和字符

每一个人物柱(即一列式CHARVARCHAR,或TEXT)有一列字符集和列排序。列定义的语法CREATE TABLEALTER TABLE具有可选子句用于指定列的字符集和字符:

col_name| | { char varchar(文本)col_length)[字符集charset_name]    [COLLATEcollation_name]

这些条款也可用于ENUMSET专栏

col_name{枚举|集}(val_list)[字符集charset_name]    [COLLATEcollation_name]

实例:

CREATE TABLE t1
(
    col1 VARCHAR(5)
      CHARACTER SET latin1
      COLLATE latin1_german1_ci
);

ALTER TABLE t1 MODIFY
    col1 VARCHAR(5)
      CHARACTER SET latin1
      COLLATE latin1_swedish_ci;

MySQL选择列的字符集和字符按以下方式:

  • 如果两CHARACTER SET charset_name整理collation_name指定字符集charset_name整理collation_name使用

    创建表T1(col1 char(10)utf8字符集的整理utf8_unicode_ci)字符集整理latin1_bin latin1;

    字符集和整理所指定的列,所以他们用。列的字符集utf8整理我们_ _ utf8 unicode

  • 如果CHARACTER SET charset_name未指定整理,字符集charset_name它的默认排序规则使用。

    创建表T1(col1 char(10)utf8字符集的字符集整理latin1_bin latin1);

    字符集是为列指定排序规则,但不。列的字符集utf8和默认的排序规则UTF8,这是utf8_general_ci。看到每个字符集的默认排序规则,使用SHOW CHARACTER SET声明

  • 如果COLLATE collation_name未指定字符集,与之相关的字符集collation_name整理collation_name使用

    创建表T1(col1 char(10)整理utf8_polish_ci)字符集整理latin1_bin latin1;

    排序规则指定的列,但没有字符集。列排序utf8_polish_ci与字符集是一个与整理有关,这是UTF8

  • 否则(不CHARACTER SET也没有整理被指定),表的字符集和字符的使用。

    CREATE TABLE t1
    (
        col1 CHAR(10)
    ) CHARACTER SET latin1 COLLATE latin1_bin;
    

    无论是字符集和整理是指定的列,所以表使用默认值。列的字符集latin1整理latin1_bin

这个CHARACTER SET整理条款是标准的SQL

如果你使用ALTER TABLE将列从一个字符集到另一个,MySQL试图地图数据的价值,但如果字符集是不兼容的,可能会有数据丢失。

10.3.6字符串的字符集和整理

每一个字符串有一个字符集和整理。

简单的语句SELECT 'string',该字符串有连接的默认字符集和整理的定义character_set_connectioncollation_connection变量系统

一个字符串可以有一个可选的字符集介绍人COLLATE条款,以将其指定为一个字符串,使用一个特定的字符集和整理:

[_charset_name]'string' [COLLATE collation_name]

字符集的范围和COLLATE条款是根据标准SQL规范实施。

实例:

SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8'abc' COLLATE utf8_danish_ci;

这个_charset_name表达的是正式称为介绍人。它告诉解析器,后面的字符串,使用字符集charset_name介绍人不改变字符串来设置像介绍人的性格CONVERT()会做的。它不改变字符串的值填充,虽然可能会发生。介绍人只是一个信号。

MySQL决定下列方式一个字符串的字符集和整理:

  • 如果两_charset_name整理collation_name指定字符集charset_name整理collation_name使用collation_name必须允许排序规则charset_name

  • 如果_charset_name但未指定整理未指定字符集charset_name它的默认排序规则使用。看到每个字符集的默认排序规则,使用SHOW CHARACTER SET声明

  • 如果_charset_name但没有指定整理collation_name指定连接的默认字符集的character_set_connection系统变量和整理collation_name使用collation_name必须允许整理连接的默认字符集。

  • 否则(不_charset_name也没有整理collation_name被指定),连接的默认字符集和整理的character_set_connectioncollation_connection使用系统变量

实例:

  • 一个二进制字符串latin1字符集和latin1_german1_cicollation:

    SELECT _latin1'Müller' COLLATE latin1_german1_ci;
    
  • 一个二进制字符串utf8字符集的默认排序规则(即,我们_通用_ UTF8):

    SELECT _utf8'Müller';
    
  • 二进制字符串binary字符集的默认排序规则(即,二元的):

    SELECT _binary'Müller';
    
  • 一个二进制字符串连接的默认字符集utf8_general_ci整理(失败如果连接字符集不UTF8):

    SELECT 'Müller' COLLATE utf8_general_ci;
    
  • 一个连接的默认字符集和整理的字符串:

    SELECT 'Müller';
    

导引指示设置以下字符串的字符,但不改变解析器如何执行处理字符串中逃脱。不总是按照字符由解析器设定的character_set_connection

下面的例子表明,逃避处理时使用character_set_connection即使在一个介绍人的存在。这个例子使用了SET NAMES(这变化character_set_connection,讨论10.4节,“连接字符集和Collations”),显示生成的字符串HEX()功能,确切的字符串内容可以看出。

例1.:

mysql> SET NAMES latin1;
mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');
+------------+-----------------+
| HEX('à\n')  | HEX(_sjis'à\n')  |
+------------+-----------------+
| E00A       | E00A            |
+------------+-----------------+

在这里,à(十六进制值E0)是由\n,表示换行转义序列。转义序列被使用character_set_connection价值latin1一个文学的产生两个换行符(十六进制值0A)。这就是发生在第二个字符串。是的,将_sjis介绍人不影响解析器的逃避处理。

例2:

mysql> SET NAMES sjis;
mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');
+------------+-------------------+
| HEX('à\n')  | HEX(_latin1'à\n')  |
+------------+-------------------+
| E05C6E     | E05C6E            |
+------------+-------------------+

在这里,character_set_connectionSJIS一个字符集,其中的序列à然后\(十六进制值055C)是一种有效的多字节字符。因此,该字符串的第一个字节被解释为一个单一的sjis性格,和\不解释为转义字符。以下n(十六进制值6E)不是解释为转义序列的一部分。这是第二个字符串是真实的;_latin1介绍人不影响逃避处理。

10.3.7国家字符集

标准SQL定义NCHARNATIONAL CHAR作为一种方法来表示CHAR柱应该使用一些预定义的字符集。MySQL的使用UTF8这个预定义的字符集。例如,这些数据类型声明是等价的:

CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)

作为这些:

VARCHAR(10) CHARACTER SET utf8
NATIONAL VARCHAR(10)
NVARCHAR(10)
NCHAR VARCHAR(10)
NATIONAL CHARACTER VARYING(10)
NATIONAL CHAR VARYING(10)

你可以使用N'literal'(或nliteral&#39;)创建一个字符串中的字符集。这些陈述是等价的:

选择n&#39;some文本;选择n&#39;some文本;选择_utf8&#39;some文本”;

10.3.8字符集介绍

一个字符串,十六进制文本,还是有点价值的文字可以有一个可选的字符集介绍人COLLATE条款,以将其指定为一个字符串,使用一个特定的字符集和整理:

[ _charset_name]literal[整理collation_name]

字符集的范围和COLLATE条款是根据标准SQL规范实施。

实例:

SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8'abc' COLLATE utf8_danish_ci;

SELECT _latin1 X'4D7953514C';
SELECT _utf8 0x4D7953514C COLLATE utf8_danish_ci;

SELECT _latin1 b'1000001';
SELECT _utf8 0b1000001 COLLATE utf8_danish_ci;

这个_charset_name表达的是正式称为介绍人。它告诉解析器,后面的字符串,使用字符集charset_name介绍人不改变字符串来设置像介绍人的性格CONVERT()会做的。它不改变字符串的值填充,虽然可能会发生。介绍人只是一个信号。

字符串字面值,介绍人和字符串之间的空间是允许的但可选。

字符串字面值可以被指定为二进制字符串用_binary介绍人。进制文字和位值字面值是二进制字符串默认情况下,所以_binary是允许的,但通常不必要。_binary可能是有用的保存点文字作为一个十六进制或二进制字符串的上下文中的文字否则视为一个号码。例如,数字或二进制位操作允许在MySQL 8和更高的字符串参数,而是把十六进制和位数字默认文字。显式指定的二进制字符串中使用这样的文字,_binary对于至少一个参数介绍:

mysql> SET @v1 = X'000D' | X'0BC0';
mysql> SET @v2 = _binary X'000D' | X'0BC0';
mysql> SELECT HEX(@v1), HEX(@v2);
+----------+----------+
| HEX(@v1) | HEX(@v2) |
+----------+----------+
| BCD      | 0BCD     |
+----------+----------+

显示的结果出现两位操作类似,但结果没有_binary是一个bigint值,而其结果_binary是一个二进制字符串。由于在结果类型的不同,显示的值不同:高阶0位数字是不是数值结果显示。

MySQL来确定一个字符串,十六进制文本的字符集和整理,还是有点价值的方式如下文字:

  • 如果两_charset_name整理collation_name指定字符集charset_name整理collation_name使用collation_name必须允许排序规则charset_name

  • 如果_charset_name但未指定整理未指定字符集charset_name它的默认排序规则使用。看到每个字符集的默认排序规则,使用SHOW CHARACTER SET声明

  • 如果_charset_name但没有指定整理collation_name指定:

    • 一个字符串,连接的默认字符集的character_set_connection系统变量和整理collation_name使用collation_name必须允许整理连接的默认字符集。

    • 一个十六进制文本或位值文字,唯一被允许的排序规则binary因为这些类型的字面值是二进制字符串默认。

  • 否则(不_charset_name也没有整理collation_name被指定):

实例:

  • 非二进制字符串latin1字符集和latin1_german1_cicollation:

    SELECT _latin1'Müller' COLLATE latin1_german1_ci;
    SELECT _latin1 X'0A0D' COLLATE latin1_german1_ci;
    SELECT _latin1 b'0110' COLLATE latin1_german1_ci;
    
  • 非二进制字符串utf8字符集的默认排序规则(即,我们_通用_ UTF8):

    SELECT _utf8'Müller';
    SELECT _utf8 X'0A0D';
    SELECT _utf8 b'0110';
    
  • 二进制字符串binary字符集的默认排序规则(即,二元的):

    SELECT _binary'Müller';
    SELECT X'0A0D';
    SELECT b'0110';
    

    十六进制字面和位值文字不需要介绍人,因为它们是二进制字符串默认。

  • 一个二进制字符串连接的默认字符集utf8_general_ci整理(失败如果连接字符集不UTF8):

    SELECT 'Müller' COLLATE utf8_general_ci;
    

    这种结构(COLLATE只)不进制文字或点文字工作因为他们的字符集二元的不管连接字符集,和binary不兼容我们_通用_ UTF8collation。二)允许的唯一的COLLATE在介绍人没有条款整理二

  • 一个连接的默认字符集和整理的字符串:

    SELECT 'Müller';
    

字符集文字、导引指示设置以下字符串的字符,但不改变解析器如何执行处理字符串中逃脱。不总是按照字符由解析器设定的character_set_connection。额外的讨论和例子,看第10.3.6”字符串的字符集和整理”

10.3.9实例字符集和整理作业

下面的例子显示如何MySQL默认字符集和整理的价值决定。

例1:表和列的定义

CREATE TABLE t1
(
    c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci
) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin;

在这里,我们有一个柱形latin1字符集和一个latin1_german1_ci整理。的定义是明确的,所以很简单。注意,有存储没有问题latin1列在latin2

例2:表和列的定义

CREATE TABLE t1
(
    c1 CHAR(10) CHARACTER SET latin1
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

这一次我们有一列latin1字符集和一个默认的排序规则。虽然它可能似乎是自然的,默认的排序规则是不是从表级。相反,因为默认的排序规则latin1总是latin1_swedish_ci,柱C1有一个整理latin1_swedish_ci(不latin1_danish_ci

例3:表和列的定义

CREATE TABLE t1
(
    c1 CHAR(10)
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

我们有一个默认的字符集和一个默认的排序列。在这种情况下,MySQL检查表水平确定列的字符集和字符。因此,设置列的字符c1latin1其排序规则latin1_danish_ci

例4:数据库、表和列的定义

CREATE DATABASE d1
    DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci;
USE d1;
CREATE TABLE t1
(
    c1 CHAR(10)
);

我们创建一个列没有指定字符集和整理。我们也没有指定字符集和整理在表级。在这种情况下,MySQL的数据库检查水平确定表设置,此后成为列设置。)因此,设置列的字符c1latin2其排序规则latin2_czech_ci

10.3.10兼容性与其他数据库管理系统

MaxDB兼容这两种说法都是一样的:

CREATE TABLE t1 (f1 CHAR(N) UNICODE);
CREATE TABLE t1 (f1 CHAR(N) CHARACTER SET ucs2);

10.4连接字符集和排序规则

几个字符集和整理系统变量和服务器客户端的交互。这些在前面已经提到:

额外的字符集和整理系统变量参与客户端和服务器之间的连接处理交通。每一个客户端连接相关的字符集和整理的系统变量。

联系是你自己当你连接到服务器。客户端发送SQL语句,如查询,在连接到服务器。服务器发送的响应,如结果集或者错误信息,在返回到客户端的连接。这导致了关于字符集和整理客户端连接处理的几个问题,每一个都可以在系统变量来回答:

  • 是什么字符集声明离开客户端时?

    服务器以character_set_client系统变量被设置,报表是由客户端发送的字符。

  • 应该用什么字符集服务器翻译语句后接受它吗?

    为此,服务器使用character_set_connectioncollation_connection系统变量。它的客户端来自于character_set_clientcharacter_set_connection,除非字符串中有介绍人(例如,_utf8mb4_latin2collation_connection对于字符串的比较是很重要的。对于比较列中字符串的值,collation_connection不要紧,因为柱有自己的整理,具有更高的优先排序。

  • 应该用什么字符集转换的服务器出货前的结果集或错误返回给客户端的信息吗?

    这个character_set_results系统变量指定的服务器返回查询结果给客户端的字符。这包括结果等数据和元数据的列值,如列名称和错误信息。

客户可以调整这些变量的值,或使用默认的(在这种情况下,你可以跳过本节的其余部分)。如果你不使用默认值,您必须更改字符设置为每个连接到服务器

两个语句影响连接字符集为一组相关的变量:

笔记

ucs2UTF16utf16le,和utf32不能作为客户端的字符集,这意味着他们不工作SET NAMESSET CHARACTER SET

MySQL客户端程序MySQLmysqladminmysqlcheckmysqlimport,和MySQLShow确定将使用默认的字符如下:

  • 在没有其他信息的情况下,该程序使用的默认字符集编译,通常utf8mb4

  • 程序可以自动检测,字符集使用基于操作系统的设置,如对价值LANGlc_all现场环境变量对UNIX系统或代码页设置在Windows系统。系统在现场可从操作系统,客户端使用它来设置默认的字符集,而不是使用默认的编译。例如,设置LANG_ ru.koi8-r .原因koi8r要使用的字符集。因此,用户可以配置现场在自己的环境中使用MySQL客户端。

    操作系统的字符集映射到最近的MySQL字符集,如果没有精确匹配。如果客户端不支持匹配字符集,它使用默认的编译。例如,ucs2不支持作为一个连接字符集。UTF8gb3212utf8mb4

    C应用程序可以使用基于操作系统通过调用字符集自动检测设置mysql_options()为连接到服务器之前:

    MySQL(MySQL,MySQL _ _选项字符集_ _ MySQL字符集名称,_ autodetect _ _名称);
  • 程序支持--default-character-set选项,用户可以指定字符集显式重写任何违约客户另有决定。

当一个客户端连接到服务器时,它将被设置为用于与服务器通信的人物的名字。服务器使用的名称设置character_set_clientcharacter_set_results,和character_set_connection系统变量。实际上,服务器执行SET NAMES使用的字符集名称操作。

MySQL客户端使用的字符集,不同于默认值,你可以明确地执行SET NAMES每次你启动。要达到相同的结果更容易,加上--default-character-set选项设置你的MySQL命令行或在你的选项文件。例如,下面的选项文件设置改变3连接相关的字符集变量设置koi8r每当你调用MySQL

[mysql]
default-character-set=koi8r

如果你使用的是MySQL客户端自动重新启用(不推荐),最好使用charset命令而不是SET NAMES。。。。。。。例如:

MySQL的&#62;charset utf8字符集的改变

这个charset指挥问题SET NAMES声明,并更改设置,默认的字符MySQL使用时,将连接后下降。

例子:这supposecolumn1被定义为(五)字符的字符集latin2。如果你不说SET NAMESSET CHARACTER SET,然后选择1 T,服务器返回的所有值column1使用设置客户端连接时指定的字符。另一方面,如果你说集名“latin1”SET CHARACTER SET latin1开证前SELECT声明中,服务器将latin2价值观latin1只是在送回结果。转换可能有损如果有不在字符的字符集。

如果你想让服务器执行任何转换的结果集或者错误信息设置character_set_results无效的binary

SET character_set_results = NULL;SET character_set_results = binary;

看到的字符集和整理系统变量的值适用于您的连接,使用这些语句:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

你还必须考虑在你的MySQL的应用程序执行环境。看到10.5节,“配置应用程序的字符集和整理”

为更多的信息关于字符集和错误信息,看10.6节,“错误信息字符集”

10.5配置应用程序的字符集和整理

使用MYSQL默认字符集和整理,存储数据的应用程序(utf8mb4我们的_ _ utf8mb4 _ 0900小时),无需特殊配置。如果应用程序需要存储数据使用不同的字符集和整理,您可以配置字符集信息的几种方法:

  • 指定字符设置每个数据库。例如,使用一个数据库,应用程序可能会使用默认的utf8mb4,而使用另一个数据库可能使用的应用程序SJIS

  • 在服务器启动字符设置指定。这使得服务器为所有不应用作其他安排使用给定的设置。

  • 在配置时设置指定的字符,如果你建立MySQL从源。这使得服务器使用的所有应用程序的默认的设置,而无需指定在服务器启动。

当不同的应用需要不同的人物设置,每个数据库技术提供了很大的灵活性。如果大多数或所有应用程序使用相同的字符集,在服务器启动或配置时指定字符设置可能是最方便的。

对于每个数据库或服务器启动技术,设置对照组数据存储的特点。应用程序还必须告诉服务器字符集使用客户端/服务器通信,如下面的说明。

这里的例子中使用的假设latin1字符集和我们_瑞典_ latin1在特定情况下整理作为一种替代办法的缺陷utf8mb4我们的_ _ utf8mb4 _ 0900小时

  • 指定字符设置每个数据库。创建一个数据库表,它将使用一个给定的默认字符集和整理数据存储,使用CREATE DATABASE这样的陈述:

    创建一个数据库字符集整理latin1_swedish_ci latin1;

    在数据库中创建表的使用latin1我们_瑞典_ latin1默认情况下,任何字符列。

    使用数据库的应用程序还应配置连接他们每次连接到服务器。这可以通过执行完成SET NAMES 'latin1'语句后连接。声明中都能使用的连接方法(MySQL我知道PHP和scripts,客户端,等等)。

    在某些情况下,它可能会将连接配置为使用其他方式所需的字符集。例如,连接使用MySQL,你可以指定--default-character-set=latin1命令行选项来达到同样的效果集名“latin1”

    有关配置客户端连接的更多信息,参见10.4节,“连接字符集和Collations”

    笔记

    如果你使用ALTER DATABASE更改数据库的默认字符集和整理,现有的存储程序,使用这些默认的数据库必须删除并重新创建的,他们使用新的默认值。(在一个存储程序,字符数据类型使用默认的数据库如果字符集或整理不显式指定的变量。看到第13.1.15,创建过程和创建函数的语法”。)

  • 在服务器启动字符设置指定。选择一个字符集在服务器启动和整理,使用--character-set-server--collation-server选项例如,指定一个选项文件的选项,包括这些线:

    [mysqld]character-set-server=latin1collation-server=latin1_swedish_ci

    这些设置应用服务器的广泛应用为任何应用程序创建数据库的默认设置,并为这些数据库中创建的表。

    它仍然是他们使用的应用程序需要连接配置SET NAMES或等效连接后,如前所述。你可能想在启动服务器--init_connect="SET NAMES 'latin1'"选择的原因SET NAMES要执行自动为每个客户端连接。然而,这可能会产生不一致的结果,因为init_connect价值是不执行用户谁有CONNECTION_ADMINSUPER特权

  • 在MySQL的配置设置指定的时间特征。如果你配置从源建立MySQL选择字符集和整理,使用DEFAULT_CHARSETDEFAULT_COLLATIONCMake备选办法:

    cmake . -DDEFAULT_CHARSET=latin1 \
      -DDEFAULT_COLLATION=latin1_swedish_ci
    

    由此产生的服务器使用latin1我们_瑞典_ latin1作为数据库和表的默认和客户端连接。这是不必要的使用--character-set-server--collation-server在服务器启动时指定的默认值。用于配置连接使用的应用程序,这也是不必要的SET NAMES他们或等效连接服务器后。

无论你如何配置设置应用程序使用mysql字符,你还必须考虑在这些应用程序执行环境。例如,如果您将使用gb3212文本从一个文件,你在编辑器中创建报表,你应该与你的环境设置为gb3212,文件编码是正确的,那么操作系统处理正确的现场编辑文件。如果你使用MySQL从一个终端窗口,在窗口的客户,必须使用gb3212字符可能无法正确显示。一个脚本执行在Web环境中,脚本必须妥善处理字符编码与MySQL服务器的交互,它必须生成页面正确显示编码让浏览器知道如何显示网页的内容。例如,你可以包含这<meta>标签在你<head>元素:

<meta http-equiv="Content-Type" content="text/html; charset=gb3212" />

10.6错误消息的字符集

本节介绍如何使用字符集的MySQL服务器构建的错误信息并返回给客户。有关错误消息的语言信息(而不是字符集),看第4,“设置错误消息的语言”。有关配置错误日志记录的一般信息,看5.4.2部分,“错误日志”

服务器的构建采用gb3212的错误信息并返回给客户指定的字符集character_set_results系统变量。客户可以设置character_set_results控制组在他们收到错误信息的特征。变量可以直接或间接通过诸如SET NAMES。为更多的信息关于character_set_results,看到10.4节,“连接字符集和Collations”

服务器构建的错误信息如下:

  • 消息模板使用gb3212。

  • 在邮件模板参数的值,适用于一个特定的错误发生取代:

    • 标识如表或列名使用gb3212内部就原样复制。

    • 字符的字符串的值(二进制)的字符集转换。

    • 二进制字符串值复制是在范围的字节0x200x7e,和使用\x十六进位的范围以外的字节编码。例如,如果一个duplicate-key错误发生在试图插入0x41cf9fVARBINARY独特的栏目,所生成的错误消息使用gb3212与一些字节十六进制编码:

      重复录入的X9F \ Xc3 \”键1

对已建成的消息返回到客户端,服务器将它从gb3212字符集指定的character_set_results系统变量。如果character_set_results有一个值无效的binary,没有发生转换。如果变量的值没有发生转换UTF8,,因为与原来的错误消息的字符集。

文字不能代表character_set_results一些编码的转换过程中,可能发生。编码采用Unicode代码点的值:

  • 在基本多文种平面特征(BMP)范围(0x00000xffff)用\nnnn符号

  • 在BMP范围的字符(0x100000x10ffff)用\+nnnnnn符号

10.7列的字符集转换

将一个二进制或非二进制字符串列使用一个特定的字符集,使用ALTER TABLE。成功的转换发生,下列条件之一的,必须申请:

  • 如果列二进制数据类型(BINARYVARBINARYBLOB),所有的价值观,它包含要使用一个单一的字符集编码(字符集你转换柱)。如果你使用一个二进制列在多个字符集存储信息,MySQL没有办法知道哪些值使用的字符集,无法将数据正确。

  • 如果列一个二进制数据类型(CHARVARCHARTEXT),其内容应列中的字符集编码,没有其他字符集。如果内容在不同的字符集编码,您可以转换柱使用二进制数据类型,并与所需的字符集的二进制列。

假设一个表t有一个二进制列命名2定义为VARBINARY(50)。如果列中的信息使用的是单字符集编码的,你可以将它转换成一个二进制列有字符集。例如,如果2包含代表字符的二进制数据greek字符集,你可以将它转换为:

修改表的修改col1 varchar(50)字符集的希腊;

如果你原来的列的类型BINARY(50),你可以将它转换成char(50),但得到的值将被填充0x00最后字节,这可能是不可取的。除去这些字节,使用TRIM()功能:

UPDATE t SET col1 = TRIM(TRAILING 0x00 FROM col1);

假设表t有一个二进制命名列2定义为CHAR(50) CHARACTER SET latin1但你想把它转换为使用UTF8这样你可以存储许多语言的价值。下面的语句完成这:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8;

转换可能有损如果列中包含不在字符的字符集。

一个特殊的情况发生,如果你有旧表在MySQL 4.1在二进制的列中包含的值实际上是一个字符编码集不同于服务器的默认字符集。例如,一个应用程序可能已储存sjis一列中的值,即使MySQL的默认字符集是不同的。可以将列使用适当的字符集,但需要一个额外的步骤。假设服务器的默认字符集latin1col1被定义为char(50)但是它的内容sjis价值观。第一步是将二进制数据类型的列,并删除现有的字符集信息没有进行任何字符转换:

修改表的修改2滴;

下一步是将柱与适当的字符集的二进制数据类型:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;

这个程序要求表没有被修改,已经与报表等INSERTUPDATE升级到MySQL 4.1或后。在这种情况下,MySQL会使用存储新值的列latin1,和列将包含一个混合的sjislatin1值无法转换正确

如果你指定的属性在创建列的最初,你也应该指定当改变表ALTER TABLE。例如,如果您指定不为空和一个明确的DEFAULT价值,你也应该在提供ALTER TABLE声明。否则,由此产生的列定义不包括那些属性。

将所有字符列在表中,该ALTER TABLE ... CONVERT TO CHARACTER SET charset声明可能是有用的。看到第13.1.8,“ALTER TABLE语法”

10.8 collation问题

下面的章节讨论了字符集的排序规则的各个方面。

10.8.1使用SQL语句整理

COLLATE条款,可以覆盖任何一个比较的默认排序规则。整理可以使用SQL语句的各个部分。这里是一些例子:

  • ORDER BY

    选择开设t1order K整理latin1_german2_ci;
  • AS

    选择K整理latin1_german2_ci作为k1from t1order由K1;
  • GROUP BY

    选择开设的latin1_german2_ci T1 K整理;
  • 与聚合函数:

    SELECT MAX(k COLLATE latin1_german2_ci)
    FROM t1;
    
  • DISTINCT

    选择不同的K整理latin1_german2_cifrom T1;
  • WHERE

    SELECT *     FROM t1     WHERE _latin1 'Müller' COLLATE latin1_german2_ci = k;
         SELECT *
         FROM t1
         WHERE k LIKE _latin1 'Müller' COLLATE latin1_german2_ci;
    
  • HAVING

    SELECT kFROM t1GROUP BY kHAVING k = _latin1 'Müller' COLLATE latin1_german2_ci;

10.8.2 COLLATE子句优先级

这个COLLATE条款具有较高的优先级(高于||),所以下面的两个表达式是等价的:

X | | collate zx | | Y(Y collate Z)

10.8.3字符集和整理的兼容性

每个字符集都有一个或多个排序规则,但每个整理与一个只有一个字符集相关。因此,下面的语句导致错误消息,因为latin2_bin整理是不合法的latin1字符集:

mysql> SELECT _latin1 'x' COLLATE latin2_bin;
ERROR 1253 (42000): COLLATION 'latin2_bin' is not valid
for CHARACTER SET 'latin1'

10.8.4整理可压缩性表达

在报表中的绝大多数,很明显是整理MySQL使用解决比较操作。例如,在下列情况下,应明确的是柱整理整理x

SELECT x FROM T ORDER BY x;SELECT x FROM T WHERE x = x;SELECT DISTINCT x FROM T;

然而,多个操作数,可以有歧义。例如:

SELECT x FROM T WHERE x = 'Y';

要比较使用的列的排序规则x,或字符串“Y”?波斯x“Y”有校勘,所以整理优先?

混合排序规则也可能比其他的比较背景下发生的。例如,一个多参数级联等操作CONCAT(x,'Y')结合其参数产生一个字符串。整理的结果应该有什么?

为了解决这些问题,MySQL检查是否一个项目的整理可以强迫其他的整理。MySQL分配可压缩性值如下:

  • 一个明确的COLLATE条款具有可压缩性0(不强制所有)。

  • 两个字符串不同排序规则连接具有可压缩性1。

  • 整理一列或存储过程参数或局部变量具有可压缩性2。

  • 系统常数(如返回的字符串的功能USER()VERSION()3)具有可压缩性

  • 一个文字的整理具有可压缩性四。

  • 一个数字或时间值的排序规则具有可压缩性5。

  • NULL或一个表达式,导出无效的具有可压缩性6

MySQL采用可压缩性值与以下的规则来解决歧义:

  • 使用排序规则与最低的可压缩性价值。

  • 如果双方有相同的可压缩性,然后:

    • 如果双方是Unicode,或者双方都不统一,这是一个错误。

    • 如果一方有一个Unicode字符集,另一边有一个非Unicode字符集,使用Unicode字符集胜的一面,并自动字符集转换应用到非Unicode的一面。例如,下面的语句不会返回错误:

      SELECT CONCAT(utf8_column, latin1_column) FROM t1;
      

      它的回报,有一个字符集的一个结果utf8和相同的整理(UTF8)。值latin1_column自动转换为UTF8在连接

    • 与从相同的字符集的操作数操作但混_bincollation and a我们__cs整理的_bin整理应用。这是类似于二进制和二进制字符串操作和评价操作数的二进制字符串,除了它是排序规则而不是数据类型。

虽然自动转换不在SQL标准,该标准并说每个字符集(在支持的字符)一子集Unicode。因为它是一个著名的原理,适用于一个超集可以应用的一个子集,我们相信,一个整理Unicode可以申请非Unicode字符串的比较。

下表说明了前面的规则的一些应用。

比较整理使用
column1 = 'A'使用整理column1
column1 = 'A' COLLATE x使用整理'A' COLLATE x
column1 COLLATE x = 'A' COLLATE y误差

确定一个字符串表达式的可压缩性,使用COERCIBILITY()函数(见12.14节,“信息功能”):

mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
        -> 0
mysql> SELECT COERCIBILITY(VERSION());
        -> 3
mysql> SELECT COERCIBILITY('A');
        -> 4
mysql> SELECT COERCIBILITY(1000);
        -> 5

为一串数字或时间值隐式转换,如发生争吵1在表达CONCAT(1, 'abc'),结果是一个字符(二进制)的字符串,字符集和整理由character_set_connectioncollation_connection变量系统。See第二节,“表达评价类型转换”

10.8.5的二进制排序规则相比,_bin排序规则

本节介绍了如何binary二进制排序规则的字符串比较to the for_bin对非二进制的粘贴

二进制字符串(如存储使用BINARYVARBINARY,和BLOB数据类型)有一个字符集和整理命名二元的。二进制字符串的字节序列,这些字节的数值确定的比较和排序。

非二进制字符串(如存储使用CHARVARCHAR,和TEXT数据类型)有一个字符集和整理以外二元的。一个给定的二进制字符集可以有多个排序规则,分别定义一个特定的比较和排序集合中的字符。其中一个是字符集表示的二进制排序规则,_bin在排序规则名称后缀。例如,二进制排序规则为latin1utf8被命名为latin1_binutf8_bin很好

这个binary“differs collation_bin在collations几钱。

比较和分类单位二进制字符串的字节序列。对于binary整理、比较和排序是基于数字的字节值。非二进制字符串的字符序列,这可能是多字节。非二进制字符串排序规则定义进行比较和排序的特征值排序。对于_bin整理,这个顺序是根据数字字符的编码值,这是类似于订购二进制字符串除了字符码值可能是多字节。

字符集转换一个二进制字符串有一个字符集和自动转换为另一个字符集在许多情况下,即使字符串具有_bincollation:

  • 当指定列的值从另一列具有不同的字符集:

    UPDATE t1 SET utf8_bin_column=latin1_column;
    INSERT INTO t1 (latin1_column) SELECT utf8_bin_column FROM t2;
    
  • 当指定列值INSERTUPDATE使用一个字符串:

    Sset names Latin1;In插入into T1(UTF8ásón binónón Column)values(&#39; string-in-lain1 &#39;);
  • 当发送结果从服务器到客户端:

    SET NAMES latin1;
    SELECT utf8_bin_column FROM t2;
    

二进制字符串列,没有发生转换。上述情况下,字符串值复制的字节明智。

lettercase转换。多进制字符集的排序规则提供lettercase字符信息,所以在一个二进制字符串中的字符可以从一个lettercase转换到另一个,甚至_bin排序规则,忽视lettercase序为:

MySQL的&#62;SET NAMES latin1 COLLATE latin1_bin;MySQL的&#62;SELECT LOWER('aA'), UPPER('zZ');————|下(AA)|上(“ZZ”)|美丽的美丽的| AA | ZZ | ------------------ ------------------

lettercase的概念并不适用于字节二进制字符串。执行lettercase转换,字符串必须转换成二进制字符串:

mysql> SET NAMES binary;
mysql> SELECT LOWER('aA'), LOWER(CONVERT('aA' USING latin1));
+-------------+-----------------------------------+
| LOWER('aA') | LOWER(CONVERT('aA' USING latin1)) |
+-------------+-----------------------------------+
| aA          | aa                                |
+-------------+-----------------------------------+

空格处理的比较大多数的MySQL排序规则有一个垫垫属性空间。例外的是Unicode排序规则基于UCA 9.0.0高,其中有没有垫垫属性。(见第10.10.1,“Unicode字符集”

要确定一个整理垫属性,使用INFORMATION_SCHEMACOLLATIONS表,其中有一个pad_attribute专栏

垫属性决定尾随空格是多进制的字符串比较治疗(CHARvarchar,和TEXT值)。没有垫治疗空间排序字符串像任何其他字符结束。PAD的空间排序,尾随空格在比较是微不足道的;字符串比较不考虑任何尾随空格:

MySQL的&#62;SET NAMES utf8 COLLATE utf8_bin;MySQL的&#62;SELECT 'a ' = 'a';+------------+| 'a ' = 'a' |+------------+|          1 |+------------+

二进制字符串中的所有字符,比较明显,包括尾随空格:

mysql> SET NAMES binary;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
|          0 |
+------------+

空格为插入和检索处理。CHAR(N)列存储二进制字符串。值小于N字符扩展空间上插入。检索,尾随的空格去掉。

BINARY(N)列存储二进制字符串。值小于N字节扩展0x00字节的插入。检索,没有拆除;价值声明的长度总是返回。

mysql> CREATE TABLE t1 (
         a CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin,
         b BINARY(10)
       );
mysql> INSERT INTO t1 VALUES ('a','a');
mysql> SELECT HEX(a), HEX(b) FROM t1;
+--------+----------------------+
| HEX(a) | HEX(b)               |
+--------+----------------------+
| 61     | 61000000000000000000 |
+--------+----------------------+

10.8.6运动学效应(collation of the

例一:整理德语变音

假定柱XT有这些latin1列的值:

mufflermüllermx systemsmysql

假设该列的值是用下面的语句检索:

SELECT X FROM T ORDER BY X COLLATE collation_name;

下表显示的顺序的值,如果我们使用ORDER BY在不同的collations。

latin1_swedish_cilatin1_german1_cilatin1_german2_ci
消声器消声器穆勒
MX系统穆勒消声器
穆勒MX系统MX系统
MySQLMySQLMySQL

在这个例子中,造成不同的排序顺序的特性是你在这两个点(ü德国人),其中呼叫U-umlaut

  • 第一列显示的结果SELECT采用瑞典和芬兰的排序规则,即U-umlaut类Y。

  • 第二列显示的结果SELECT采用德国din-1规则,即美国U-umlaut类

  • 第三列显示的结果SELECT采用德国din-2规则,说U-umlaut类UE。

例2:寻找德国变音

假设你有三桌,仅由不同的字符集和整理使用:

mysql> SET NAMES utf8;
mysql> CREATE TABLE german1 (
         c CHAR(10)
       ) CHARACTER SET latin1 COLLATE latin1_german1_ci;
mysql> CREATE TABLE german2 (
         c CHAR(10)
       ) CHARACTER SET latin1 COLLATE latin1_german2_ci;
mysql> CREATE TABLE germanutf8 (
         c CHAR(10)
       ) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

每个表包含两个记录:

mysql> INSERT INTO german1 VALUES ('Bar'), ('B?r');
mysql> INSERT INTO german2 VALUES ('Bar'), ('B?r');
mysql> INSERT INTO germanutf8 VALUES ('Bar'), ('B?r');

两报有一个以上的排序规则。A = ?平等,和一个没有这样的平等(用_ german2 _以下)。出于这个原因,你会得到这些结果的比较:

mysql> SELECT * FROM german1 WHERE c = 'B?r';
+------+
| c    |
+------+
| Bar  |
| B?r  |
+------+
mysql> SELECT * FROM german2 WHERE c = 'B?r';
+------+
| c    |
+------+
| B?r  |
+------+
mysql> SELECT * FROM germanutf8 WHERE c = 'B?r';
+------+
| c    |
+------+
| Bar  |
| B?r  |
+------+

这是不是一个错误,而是一种分选性能的后果latin1_german1_ci我们_ _ utf8 unicode(排序是按照德国DIN 5007标准做的)。

10.8.7使用information_schema搜索排序

弦柱INFORMATION_SCHEMA表整理我们_通用_ UTF8,这是不区分大小写。然而,这对应于文件系统中表示的对象的值,如数据库和表,搜索INFORMATION_SCHEMA弦柱可以敏感或不敏感,依赖于底层的文件系统的特点和lower_case_table_names系统变量设置。例如,搜索可能是区分大小写的文件系统是大小写敏感的话。本节描述了这种行为和如何修改有必要。

假设一个查询搜索SCHEMATA.SCHEMA_NAME列为测试数据库在Linux中,文件系统是大小写敏感的,所以比较SCHEMATA.SCHEMA_NAME“测试”比赛,但比较'TEST'不:

MySQL的&#62;SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATAWHERE SCHEMA_NAME = 'test';图式名称| ------------------ _ | ------------------ |测试MySQL &#62; | ------------------SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATAWHERE SCHEMA_NAME = 'TEST';空集合(0秒)

这些结果发生如果lower_case_table_names系统变量设置为0.。一lower_case_table_names1或2设置导致第二查询返回相同的结果(非空)作为第一个查询。

笔记

禁止在启动服务器lower_case_table_names设置不同的设置时使用的服务器初始化。

在Windows或MacOS,文件系统是不区分大小写的,所以比较匹配'test'“测试”

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME = 'TEST';
+-------------+
| SCHEMA_NAME |
+-------------+
| TEST        |
+-------------+

价值lower_case_table_names使在这方面没有差异

先行行为发生的原因utf8_general_ci排序规则是没有用的information_schema查询搜索时,对应的文件系统表示的对象的值。

如果一个字符串操作的结果INFORMATION_SCHEMA柱不同于预期,一个解决方法是使用一个显式的整理条款将适当的整理(见第10.8.1使用整理,在SQL语句”)。例如,执行不区分大小写的搜索,使用COLLATEinformation_schemacolumn name:

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME COLLATE utf8_general_ci = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME COLLATE utf8_general_ci = 'TEST';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+

你也可以使用UPPER()LOWER()功能:

WHERE UPPER(SCHEMA_NAME) = 'TEST'WHERE LOWER(SCHEMA_NAME) = 'test'

虽然不区分大小写的比较,甚至可以区分大小写的文件系统平台上进行的,只是,它不一定总是做正确的事。在这样的平台上,可能只有在lettercase不同的名称有多个对象。例如,表city城市,和City可以同时存在。考虑一个搜索应该匹配所有这样的名字或者只是一个编写查询相应。下面的第一个(与比较UTF8)是最敏感的;其他人都没有:

WHERE TABLE_NAME COLLATE utf8_bin = 'City'
WHERE TABLE_NAME COLLATE utf8_general_ci = 'city'
WHERE UPPER(TABLE_NAME) = 'CITY'
WHERE LOWER(TABLE_NAME) = 'city'

搜索INFORMATION_SCHEMA字符串列值参考information_schema自己做的使用utf8_general_ci整理因为information_schema是一个事实上的数据库不代表文件系统。例如,比较SCHEMATA.SCHEMA_NAME比赛信息_ Schema'INFORMATION_SCHEMA'无论平台:

MySQL的&#62;SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATAWHERE SCHEMA_NAME = 'information_schema';图式名称| -------------------- _ | -------------------- |信息_图式| -------------------- MySQL &#62;SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATAWHERE SCHEMA_NAME = 'INFORMATION_SCHEMA';-------------------- | schema_name | -------------------- | information_schema | --------------------

10.9 Unicode支持

Unicode标准包括从基本多文种平面特征(BMP)和补充字符之外的BMP。本节介绍了在MySQL支持Unicode。关于Unicode标准本身的信息,访问Unicode联合会网站

BMP字符具有这些特点:

  • 他们的代码点的值是0和65535之间(或U+0000u FFFF

  • 他们可以在一个可变长度编码编码使用8,16,或24位(1字节到3字节)。

  • 他们可以在一个固定长度的编码采用16位编码(2字节)。

  • 他们主要的语言有足够的几乎所有特征。

补充字符之外的BMP:

  • 他们的代码点的值之间U+10000U 10ffff

  • Unicode支持补充字符需要有一个范围外的BMP字符因此需要更多的空间比BMP字符的字符集(每个字符4个字节)。

gb3212(Unicode转换格式与8位单位)编码Unicode数据的方法是根据RFC 3629实现,描述了编码序列,从一个到四个字节。gb3212的想法是不同的Unicode字符使用不同长度的字节序列编码:

  • 基本拉丁字母、数字和标点符号,使用一个字节。

  • 大多数欧洲和中东文字字母放入一个字节序列:扩展拉丁字母(用波浪线、万安、急性、严重和其他口音),斯拉夫语,希腊语,希伯来语,阿拉伯语,Syriac语,和别人。

  • 韩国,中国,和日本的汉字使用3字节或4字节序列。

MySQL支持Unicode字符集:

  • utf8mb4对每一特征:使用4字节集gb3212编码的Unicode字符编码。

  • utf8mb3:使用一个每字符三字节集gb3212编码的Unicode字符编码。

  • utf8别名:utf8mb3

  • ucs2:的Unicode字符集的UCS-2编码每个字符使用两个字节。

  • utf16:每个字符使用两个或四个字节集UTF-16 Unicode字符编码。喜欢UCS2但补充字符扩展

  • utf16le:对于Unicode字符集编码UTF-16LE。喜欢UTF16但小端而不是大端

  • utf32:每个字符使用4字节设置为Unicode字符编码UTF-32。

表10.2、“Unicode字符集的一般特征”,对Unicode字符的一般特性集支持MySQL。

表10.2 Unicode字符集的一般特征

字符集支持的字符所需的存储每个字符
utf8mb3UTF8BMP只1,2,或3个字节
ucs2BMP只2字节
utf8mb4BMP和补充1,2,3,或4个字节
utf16BMP和补充2或4个字节
utf16leBMP和补充2或4个字节
utf32BMP和补充4字节

在BMP字符比较替换字符转换'?'当转换为只支持BMP字符的Unicode字符集(utf8mb3ucs2

如果你使用的字符集的支持补充字符,因此更广的唯一比BMPutf8mb3UCS2字符集,有潜在的不兼容问题,为您的应用程序;看第10.9.8”之间转换,3字节和4字节Unicode字符集”。这部分还介绍了如何将表从(3字节)utf8mb3对(4字节)utf8mb4什么样的约束,可以这样做。

一组类似的排序规则是适用于大多数的Unicode字符集。例如,每有一个丹麦的整理,其名称是utf8mb4_danish_ci我们_ utf8mb3 _丹麦utf8_danish_ci我们_ UCS2 _丹麦utf16_danish_ci,和我们_ utf32 _丹麦。唯一的例外是utf16le,其中只有两个排序规则。关于Unicode排序规则和不同性质的信息,包括补充字符的排序性能,看第10.10.1,“Unicode字符集”

对UCS-2,UTF-16 MySQL实现,并在大端字节序UTF-32商店字符和不使用的字节顺序标记(BOM)在值的开始。其他的数据库系统可以使用little-endian字节序或BOM。在这种情况下,转换的值需要进行传输时的系统和MySQL之间的数据。的实施是little-endian UTF-16LE。

MySQL使用utf - 8是在正确的价值观。

客户端应用程序使用Unicode服务器通信应设置相应的客户特征;例如,通过发行SET NAMES 'utf8mb4'声明UCS2utf16Utf16le,和utf32不能作为客户端的字符集,这意味着他们不工作SET NAMESSET CHARACTER SET。。。。。。。(这10.4节,“连接字符集和Collations”。)

以下部分提供了对MySQL的Unicode字符集的更多细节。

10.9.1的utf8mb4(4字节gb3212字符集Unicode编码)

这个utfmb4字符集具有这些特点:

  • 支持BMP和补充字符。

  • 需要最高每多字节字符的四字节。

utf8mb4与之相反的utf8mb3字符集,它只支持BMP字符以最高每字符三个字节:

  • 一个BMP字符,utf8mb4utf8mb3具有相同的存储特点:相同的代码值,相同的编码长度相同。

  • 对增补字符,utf8mb4需要四个字节来存储,而utf8mb3无法储存的所有字符。当转换utf8mb3utf8mb4,你不用担心转换补充字符因为就没有了。

utf8mb4是一个超集utf8mb3,所以一个操作如下面的连接,结果字符集utf8mb4和整理在utf8mb4 _

SELECT CONCAT(utf8mb3_col, utf8mb4_col);

同样,以下的比较WHERE条款根据整理工作在utf8mb4 _

SELECT * FROM utf8mb3_tbl, utf8mb4_tbl
WHERE utf8mb3_tbl.utf8mb3_col = utf8mb4_tbl.utf8mb4_col;

有关数据类型存储的信息,因为它涉及到多字节字符集,看字符串类型的存储要求

10.9.2的utf8mb3(3字节gb3212字符集Unicode编码)

这个utf8mb3字符集具有这些特点:

  • 支持BMP字符(不支持补充字符)

  • 需要最高每多字节字符的三字节。

应用程序使用gb3212数据但需要补充字符支持应该使用utf8mb4而不是utf8mb3(见第10.9.1,“utf8mb4(4字节gb3212字符集Unicode编码)”

完全相同的字符集是可用的utf8mb3UCS2。那就是,他们有相同的剧目

utf8是一个别名utf8mb3;字符限制是隐含的,而不是显式的名字。

笔记

这个utf8mb3字符集将被取代utf8mb4在某个未来的MySQL版本。虽然utf8目前是一个别名utf8mb3,在这一点上utf8将成为一个参考utf8mb4。避免歧义的意义utf8,考虑指定utf8mb4明确的引用而不是字符集utf8

utf8mb3可用于字符集条款,并utf8mb3_collation_substring进入整理条款,在collation_substring箱子czech_ci我们_丹麦esperanto_ciestonian_ci,等等。例如:

CREATE TABLE t (s1 CHAR(1) CHARACTER SET utf8mb3;
SELECT * FROM t WHERE s1 COLLATE utf8mb3_general_ci = 'x';
DECLARE x VARCHAR(5) CHARACTER SET utf8mb3 COLLATE utf8mb3_danish_ci;
SELECT CAST('a' AS CHAR CHARACTER SET utf8) COLLATE utf8_czech_ci;

立即将MySQL实例utf8mb3在陈述UTF8,所以在这样的语句SHOW CREATE TABLE选择character_set_name从information_schema.columnsSELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS,用户看到的名称UTF8utf8_collation_substring

utf8mb3在环境以外的其他也是有效的字符集条款。例如:

mysqld --character-set-server=utf8mb3
组名utf8mb3 &#39;;/ *和其他设置,也有类似的效果* /选择_utf8mb3 &#39;报表;

有关数据类型存储的信息,因为它涉及到多字节字符集,看字符串类型的存储要求

10.9.3 UTF8字符集(Alias utf8mb3)

utf8是一个别名为utf8mb3字符集。有关更多信息,参见第10.9.2,“utf8mb3(3字节gb3212字符集Unicode编码)”

笔记

这个utf8mb3字符集将被取代utf8mb4在某个未来的MySQL版本。虽然utf8目前是一个别名utf8mb3,在这一点上utf8将成为一个参考utf8mb4。避免歧义的意义utf8,考虑指定utf8mb4明确的引用而不是字符集utf8

10.9.4 UCS2字符集(UCS-2编码)

在UCS-2,每一个角色都是由一个双字节Unicode编码表示最重要的字节第一。例如:LATIN CAPITAL LETTER A有代码0x0041它存储为一个字节序列:0x00 0x41西里尔文小写字母yeru(Unicode0x044B)存储为一个字节序列:0x4b 0x04。对于Unicode字符和代码,请参阅Unicode联合会网站

这个ucs2字符集具有这些特点:

  • 支持BMP字符(不支持补充字符)

  • 使用一个固定长度的16位编码,每个字符需要两个字节。

10.9.5的UTF16字符集(UTF-16 Unicode编码)

这个utf16字符集是UCS2一个扩展,使补充字符编码字符集:

  • 一个BMP字符,utf16UCS2具有相同的存储特点:相同的代码值,相同的编码长度相同。

  • 对增补字符,utf16因为使用32位代表字符的特殊序列。这就是所谓的代理机制:一个数大于0xffff,以10位并将它们添加到0xd800放在第一位的话,把十多位并将它们添加到0xdc00放在下一个16位的字。因此,所有补充字符需要32位,其中第一位是一个介于0xd8000xdbff,和最后16位之间的一个数字0xdc000xdfff。例如在第15.5代理区域在Unicode 4.0文件。

因为utf16支持代理和UCS2不,有一个有效性检查,仅适用于utf16:不能插入顶替代无底的替代,反之亦然。例如:

插入T(ucs2_column)值(0xd800);/ *法律* /插入T(utf16_column)值(0xd800);/ * * /非法

有,在技术上是有效的但不是真正的Unicode字符没有有效性检查(即字符的Unicode认为是未分配的代码点私人使用人物甚至非法移民喜欢0xffff页:1For example,sinceU f8ff是苹果的标志,这是法律:

INSERT INTO t (utf16_column)VALUES (0xf8ff); /* legal */

这样的人物不可能指的是同一件事的人。

因为MySQL必须考虑最坏的情况下(即一个字符需要四个字节)的最大长度utf16柱或指数只有一半的最大长度为UCS2列或索引。例如,一个最大长度MEMORY表索引的关键是3072个字节,所以这些语句创建表的最长允许指标UCS2utf16专栏

CREATE TABLE tf (s1 VARCHAR(1536) CHARACTER SET ucs2) ENGINE=MEMORY;CREATE INDEX i ON tf (s1);CREATE TABLE tg (s1 VARCHAR(768) CHARACTER SET utf16) ENGINE=MEMORY;CREATE INDEX i ON tg (s1);

10.9.6 the utf16le(UTF - 16le Unicode字符集编码)

这是一样的utf16但小端而不是大端

10.9.7 utf32(UTF-32字符集的Unicode编码)

这个utf32字符集的长度是固定的(如UCS2不像utf16utf32使用32位的每一个字符,不像ucs2(使用16位的每一个字符),而不像UTF16(使用16位字符和32位其他人)。

utf32以两倍的空间UCS2和更多的空间比utf16,但utf32具有相同的优势ucs2这是可以预见的存储所需的字节数为:utf32字符数等于4倍。另外,不同于utf16,有没有技巧的编码utf32,所以存储的值等于码值。

说明后者的优势是有用的,这里有一个例子,说明如何确定utf8mb4值了utf32代码值:

/* Assume code value = 100cc LINEAR B WHEELED CHARIOT */
CREATE TABLE tmp (utf32_col CHAR(1) CHARACTER SET utf32,
                  utf8mb4_col CHAR(1) CHARACTER SET utf8mb4);
INSERT INTO tmp VALUES (0x000100cc,NULL);
UPDATE tmp SET utf8mb4_col = utf32_col;
SELECT HEX(utf32_col),HEX(utf8mb4_col) FROM tmp;

MySQL是非常宽容的对指定的Unicode字符或字符添加专用区。实际上只有一个有效性检查utf32:无码值可能大于0x10ffff。例如,这是违法的:

INSERT INTO t (utf32_column) VALUES (0x110000); /* illegal */

10.9.8转换Unicode字符集之间的3字节和4字节

本节介绍,你可能会面临转换之间的字符数据时的问题utf8mb3utf8mb4字符集

笔记

这个讨论主要集中于之间的转换utf8mb3utf8mb4,但类似的原则也适用于转换之间ucs2字符集和字符集等UTF16utf32

这个utf8mb3utf8mb4如下字符集不同:

  • utf8mb3支持在基本多文种平面只有角色(BMP)。utf8mb4另外支持补充字符之外的BMP。

  • utf8mb3使用最大每字符三个字节。utf8mb4使用最大每字符四个字节。

笔记

这个讨论是指utf8mb3utf8mb4字符集名称是指3字节和4字节gb3212字符集的数据显。唯一的例外是在表定义,utf8是因为MySQL转换实例utf8mb3在这样的定义来指定utf8这是一个别名,utf8mb3

一个优势转化utf8mb3utf8mb4这使应用程序能够使用增补字符。一个权衡,这可能会增加数据存储空间的要求。

在表的内容,转换utf8mb3utf8mb4没有问题:

  • 一个BMP字符,utf8mb4utf8mb3具有相同的存储特点:相同的代码值,相同的编码长度相同。

  • 对增补字符,utf8mb4需要四个字节来存储,而utf8mb3无法储存的所有字符。当转换utf8mb3utf8mb4,你不用担心转换补充字符因为就没有了。

在表结构方面,这些是主要的潜在的不兼容:

  • 对于可变长度的字符数据类型(VARCHARTEXT类型),允许的最大字符长度小于utf8mb4柱比utf8mb3专栏

  • 所有字符数据类型(CHARVARCHAR,和TEXT类型),可以建立索引的最大字符数少utf8mb4柱比utf8mb3专栏

因此,转换表utf8mb3utf8mb4,它可能需要改变一些列或索引的定义。

表格可以转换utf8mb3utf8mb4通过使用ALTER TABLE。假设一个表定义:

创建表T1(col1 char(10)utf8字符集的整理utf8_unicode_ci不空,COL2 char(10)utf8字符集的整理utf8_bin utf8字符集不为空);

下面的语句将t1使用utf8mb4

ALTER TABLE t1
  DEFAULT CHARACTER SET utf8mb4,
  MODIFY col1 CHAR(10)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  MODIFY col2 CHAR(10)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;

捕捉时转换utf8mb3utf8mb4那是一列或索引键的最大长度从不变字节。因此,它是小的人物因为一个字符的最大长度是四字节,而不是三。对于CHARVARCHAR,和TEXT数据类型,注意这些问题转换你的MySQL表时:

  • 检查所有的定义utf8mb3柱和确保他们不会超过最大长度的存储引擎。

  • 检查所有的指标utf8mb3柱和确保他们不会超过最大长度的存储引擎。有时最高可以改变由于存储引擎增强。

如果前面的条件,你必须减少列或索引定义的长度,或继续使用utf8mb3而不是utf8mb4

这里有一些例子,结构变化的需要:

  • TINYTEXT柱可容纳255个字节,所以可以装85个3字节或63个4字节字符。假设你有一个TINYTEXT柱的使用utf8mb3但必须能够容纳超过63字符。你不能把它转化为utf8mb4除非你改变数据类型如长型TEXT

    同样的,一个很长的VARCHAR列可能需要改变一个更长TEXT类型如果你想把它从utf8mb3utf8mb4

  • InnoDB有一个767字节的表使用的最大索引长度粉盒REDUNDANT行格式,所以utf8mb3utf8mb4列,你可以指数最高为255或191个字符,分别。如果你现在有utf8mb3指标不能超过191个字符的列,您必须指数较小的字符数。

    在一个InnoDB表格的使用粉盒REDUNDANT行格式,这些列和索引的定义是合法的:

    2 varchar(500)字符集utf8,指数(col1(255))

    使用utf8mb4相反,指数必须小于:

    2 varchar(500)字符集utf8mb4,指数(col1(191))
    笔记

    InnoDB表使用压缩的DYNAMIC行格式,前缀索引超过767个字节(3072字节)是允许的。这些行的格式创建的表使你指数最高为1024或768个字符utf8mb3utf8mb4列,分别。相关的信息,看第15.8.1.7”限制,InnoDB表”,和第15.10.3,动态压缩行格式”

前一种变化是最有可能的是如果你有很长的柱或指标要求。否则,你应该能够将你的表utf8mb3utf8mb4没有问题,使用ALTER TABLE如前所述

以下项目总结其他潜在的不兼容:

  • SET NAMES 'utf8mb4'原因使用设定连接字符集的4字节的字符。只要没有4字节的字符是从服务器发送的,应该没有问题。否则,应用程序期望得到最高每字符三个字节可能有问题。相反,应用程序,寄期望于4字节的字符必须确保服务器理解他们。

  • 为复制,如果字符集支持补充字符被用在主,所有的奴隶都必须理解他们一样。

    还有,记住,如果一个表对主人和奴隶的不同定义的一般原则,这会导致意外的结果。例如,在最大索引键长的差异使其使用风险utf8mb3上主,utf8mb4在奴隶

如果你有转换utf8mb4UTF16utf16le,或utf32,然后决定转换回utf8mb3UCS2(例如,降级到旧版本的MySQL),这些考虑应用:

  • utf8mb3UCS2数据应该没有问题

  • 服务器必须足够新认识的定义指的是字符集,您将。

  • 对象的定义,请参阅utf8mb4字符集,你可以把他们mysqldump在降级,编辑转储文件的变化情况utf8mb4UTF8,并重新加载文件在旧的服务器,只要有没有4字节字符数据。旧的服务器会看到utf8转储文件中的对象定义和创建新的对象,使用(3字节)UTF8字符集

10支持的字符集和整理

本节说明MySQL支持的字符集。有一款为每一组相关的字符集。每个字符集,列出了允许的排序规则。

列出可用的字符集和它们的默认排序规则,使用SHOW CHARACTER SET表或查询information_schemaCHARACTER_SETS表。例如:

MySQL的&#62;SHOW CHARACTER SET;---------- ---------------------------------意图——| |默认字符集描述| collation | maxlen | ---------- ---------------------------------意图——| armscii8 | armscii 8 armenian | armscii8 _ _将军祠| 1 | | | ASCII ASCII码美国| _ _将军祠| 1 | | BIG5 | BIG5传统华人华侨| BIG5 _ _ CI | 2 | | | BINARY二进制伪随机二进制编码| | 1 | | cp1250 | Windows中欧| cp1250 _ _将军祠| 1 | |舒适套装CP1251 | Windows cyrillic |舒适套装CP1251 _ _将军祠| 1 | | cp1256 | Windows |阿拉伯cp1256 _ _将军祠| 1 | | cp1257 | Windows波罗的海| cp1257 _将军_ CI | 1 | | cp850 | DOS西欧洲| cp850 _ _将军祠| 1 | | cp852 | DOS的中欧| cp852 _ _将军祠| 1 | | cp866 | DOS俄罗斯n                     | cp866_general_ci    |      1 || cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 || dec8     | DEC West European               | dec8_swedish_ci     |      1 || eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 || euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 || gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 || gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 || gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 || geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 || greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 || hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 || hp8      | HP West European                | hp8_english_ci      |      1 || keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 || koi8r    | KOI8-R Relcom Russian           | koi8r _ _将军祠| 1 | | koi8u | koi8-u乌克兰| koi8u _ _将军祠| 1 | | latin1 | cp1252西欧洲| latin1 _瑞典_ CI | 1 | | latin2 | ISO 8859-1 2中欧| latin2 _ _将军祠| 1 | | latin5 | ISO 8859-1 9 | latin5 _土耳其土耳其_ CI | 1 | | latin7 | ISO 8859-1 13波罗的海| latin7 _ _将军祠| 1 | |主要心血管事件的| MAC中欧|主要心血管事件的_ _将军祠| 1 | | macroman | MAC西欧洲| macroman _ _将军祠| 1 | | sjis | Shift JIS日本| sjis _ CI 2日_ | | | swe7 |设计了七位瑞典| swe7 _瑞典_ CI | 1 | | tis620 | tis620泰国| tis620 _泰国_ CI | 1 | | ucs2 | UCS-2编码| ucs2 _ _将军祠| 2 | | ujis |日文的日本| ujis _日本_ CI |

如果字符集有多个排序规则,它可能不是很清楚,整理是最适合一个给定的应用程序。避免选择错误的整理,可以进行一些比较有代表性的数据值来确定一个给定值整理各种你期望的方式。

10.10.1 Unicode字符集

MySQL支持多个Unicode字符集:

  • utf8mb4:使用一个每字符四字节集gb3212编码的Unicode字符编码。

  • utf8mb3:使用一个每字符三字节集gb3212编码的Unicode字符编码。

  • utf8别名:utf8mb3

  • ucs2:的Unicode字符集的UCS-2编码每个字符使用两个字节。

  • utf16:每个字符使用两个或四个字节集UTF-16 Unicode字符编码。喜欢UCS2但补充字符扩展

  • utf16le:对于Unicode字符集编码UTF-16LE。喜欢UTF16但小端而不是大端

  • utf32:每个字符使用四个字节设置为Unicode字符编码UTF-32。

utf8UCS2支持基本多文种平面(BMP)的特点。utf8mb4UTF16utf16le,和utf32支持BMP和补充字符。

本节描述可用于Unicode字符集及其分化特性的比较。关于Unicode的一般信息,看第10,“Unicode支持”

大多数的Unicode字符集有一个总的整理(表示的_general在名称或缺乏一种语言规范),(所表示的二进制排序规则_bin的名字),和一些特定语言的排序规则(由语言说明符指示)。例如,对于utf8我们_通用_ UTF8utf8_bin其一般的二进制排序规则,并我们_ UTF8 _丹麦是它的一个特定语言的排序规则。

整理支持utf16le是有限的。唯一可用的排序规则我们utf16le _通用_utf16le_bin。这些都是类似的我们utf16 _通用_utf16_bin

区域代码或语言名称如下表所示的指示一个特定语言的排序规则。Unicode字符集可以包含一个或多个这些语言的排序规则。

表10.3 Unicode排序规则语言说明符

语言语言规范
古典拉丁语la罗马
克罗地亚hr克罗地亚
捷克cs捷克
丹麦人da丹麦人
世界语eo世界语
爱沙尼亚et爱沙尼亚
德国的电话订单de_pbgerman2
匈牙利语hu匈牙利语
冰岛is冰岛
日语ja
拉脱维亚lv拉脱维亚
立陶宛lt立陶宛
波斯语persian
波兰pl波兰
罗马尼亚人ro罗马尼亚人
俄罗斯人ru
僧伽罗语sinhala
斯洛伐克sk斯洛伐克
斯洛文尼亚sl斯洛文尼亚
现代西班牙语es西班牙语
传统的西班牙es_tradspanish2
瑞典语sv瑞典语
土耳其语tr土耳其语
越南人vi越南人

克罗地亚排序规则是针对这些克罗地亚字母:??D??Lj新泽西??

丹麦和挪威collations可以用于。

对于日本的utf8mb4字符集包括utf8mb4_ja_0900_as_csutf8mb4_ja_0900_as_cs_ks粘贴。波斯胶粘是口音的口音灵敏。utf8mb4 _和_ 0900 _作为_ CS _ KS同样是敏感和区分假名片假名字符从平假名字符,而utf8mb4_ja_0900_as_cs把平假名和片假名字符作为平等的分类。应用程序需要一个日本整理但不可能使用假名的敏感性utf8mb4_ja_0900_as_cs为更好的排序性能utf8mb4_ja_0900_as_cs使用三个体重级别进行排序;utf8mb4 _和_ 0900 _作为_ CS _ KS使用四

古典拉丁语的排序规则,不区分重音,IJ相等的,和Uv相等的IJ,和Uv比较的基础上,文字水平等。换句话说,J作为一个重音I,和U作为一个重音v

西班牙的排序规则是可供现代和传统的西班牙。两,?(n-tilde)之间的一个单独的信No。此外,传统的西班牙,中国在一个单独的信cD,和ll在一个单独的信lm

西班牙传统的排序规则也可以用于阿斯图里亚斯和加利西亚。

瑞典:瑞典排序规则。例如,在瑞典,下列关系成立,这是不是预期的德国或法国的扬声器:

ü = Y < ?

有关特定语言的排序问题,unicode.org提供常见的现场数据库(cldr)整理排行榜www.unicode.org http:/ / / / / /整理cldr图30。

这个xxx_general_mysql500_ci排序规则保存pre-5.1.24的原序xxx我们_通用_在MySQL 5.1.24校勘为表创建许可证升级(bug # 27877)。

MySQL实现xxx_unicode_ci根据《collations Unicode(UCA)在整理算法描述www.unicode.org http:/ / / / /报告tr10。整理采用version-4.0.0 UCA重键:http://www.unicode.org/public/uca/4.0.0/allkeys-4.0.0.txt。这个xxx_unicode_ci排序规则只有部分支持Unicode排序算法。不支持的一些特点,并结合标记不完全支持。这种影响主要是越南人,约鲁巴语,和一些较小的语言如纳瓦霍语。一个组合字符被认为是不同的从相同的字符与字符串比较单个Unicode字符,和两个字符被认为具有不同的长度(例如,作为返回的CHAR_LENGTH()功能或结果集元数据)。

Unicode排序规则基于UCA版本晚于4.0.0包括在排序规则名称版本。因此,utf8mb4_unicode_520_ci基于UCA 5.2.0重键(http://www.unicode.org/public/uca/5.2.0/allkeys.txt(Wherek)utf8mb4_0900_ai_ci基于UCA 9.0.0重键(http://www.unicode.org/public/uca/9.0.0/allkeys.txt

基于UCA 9.0.0和较高的比基于均匀圆阵的版本低于9.0.0排序更快的排序规则。他们也有一个没有垫垫属性,与垫空间中使用基于均匀圆阵的版本低于9.0.0排序规则。没有垫治疗空间排序字符串像任何其他字符结束。

要确定一个整理垫属性,使用INFORMATION_SCHEMACOLLATIONS表,其中有一个pad_attribute专栏

比较VARCHAR有无垫整理其他排序规则方面的不同列的尾随空格。例如,&#39; &#39;'a '比较不同的字符串,不相同的字符串。

MySQL实现特定语言的Unicode排序规则如果订货仅基于UCA不为语言的工作。特定语言的排序规则是UCA,额外的语言设计规则。

例如,特定的非语言utf8mb4_0900_ai_ci和特定的语言utf8mb4_LOCALE我们的_ _ _ 0900小时Unicode排序规则都有这些特点:

  • 整理是基于Unicode排序算法(UCA)9.0.0和常见的现场数据库(cldr)V30,是口音不敏感,且不区分大小写。这些特征表明_0900_ai,和_ci在排序规则名称。例外:该utf8mb4 _ _ 0900小时我们的_ _不是基于CLDR因为古典拉丁语中没有定义CLDR。

  • 整理工作范围内的所有字符[ U 0,U 10ffff ]。

  • 如果整理不特定于语言的,这类的所有特征,包括补充字符,默认为(描述)。如果整理的特定语言,这类语言正确地根据特定语言的规则的特点,而不是在默认命令语言的特点。

  • 默认情况下,整理各种文字的编码点在DUCET表列(默认Unicode排序规则元素表)根据表中分配的权重值。整理各种各样的人物没有一个代码点的使用其隐含的权重值DUCET表列,它是根据UCA构造。

  • 非特定语言的排序规则,在收缩顺序的字符将被视为单独的字符。对于特定语言的排序规则,收缩可能改变字符的排序。

LOWER()UPPER()根据他们的观点进行整理折叠箱。一个字符,大写和小写只有Unicode版本4.0.0版本比最近的这些功能只有参数有一个整理,使用一个足够新UCA版本转换。

任何Unicode字符集、操作使用xxx_general_ci整理比快xxx我们_ _ Unicode整理。例如,比较的我们_通用_ UTF8整理速度更快,但不正确的,比比较utf8_unicode_ci。这样做的原因是,我们_ _ utf8 unicode支持映射如膨胀;那是,当一个字符比较为其他字符组合。例如,在德国和其他一些语言?等于SSutf8_unicode_ci还支持收缩和忽略的人物。我们_通用_ UTF8是一个传统的整理,不支持扩展,收缩,或忽略的人物。它可以使只有一个字符之间的比较。

为了进一步说明,在持有下列等式utf8_general_ci我们_ _ utf8 unicode(本效果比较或搜索,看到第10.8.6,“整理”效应的例子):

? = A
? = O
ü = U

之间的排序一不同的是,这是真实的utf8_general_ci

? = s

而这是真实的utf8_unicode_ci,支持德国din-1排序(也被称为字典顺序):

? = ss

MySQL实现utf8特定语言的排序规则如果与排序我们_ _ utf8 unicode没有一种语言工作。例如,utf8_unicode_ci德语字典顺序和法国的精品,所以不需要创建特殊的UTF8排序规则

utf8_general_ci同样是令人满意的同时,德国和法国,除了?等于s,而不是SS。如果你的应用是可以接受的,你应该使用utf8_general_ci由于是期房。如果这是不可接受的(例如,如果你需要德语字典顺序),使用我们_ _ utf8 unicode因为它是更准确

如果你需要德国din-2(电话簿)订购、使用utf8_german2_ci整理、比较下列字符等集:

? = ? = AE? = ? = OEü = UE? = ss

utf8_german2_ci类似于用_ german2 _以下,但后者没有比较?等于AE?等于OE。没有utf8_german_ci对应德语省份因为德语字典顺序utf8_general_ci

除了二进制Unicode排序规则(_bin)的排序规则,MySQL执行表查找,找到一个字符的排序权重。这个重量可以显示使用WEIGHT_STRING()功能。(见12.5节,“字符串函数”。)如果一个角色不在表中(例如,因为它是一个字符),排序权重的确定变得更加复杂:

  • 在一般的排序规则BMP字符(xxx_general_ci), weight = code point.

  • 在台湾排序规则BMP字符(例如,xxx_unicode_ci和语言特定的排序规则),下面的算法应用:

    if (code >= 0x3400 && code <= 0x4DB5)  base= 0xFB80; /* CJK Ideograph Extension */else if (code >= 0x4E00 && code <= 0x9FA5)  base= 0xFB40; /* CJK Ideograph */else  base= 0xFBC0; /* All other characters */aaaa= base +  (code >> 15);bbbb= (code & 0x7FFF) | 0x8000;

    结果是一个序列的两个排序的元素,aaaa然后双侧束支传导阻滞。。。。。。。例如:

    mysql> SELECT HEX(WEIGHT_STRING(_ucs2 0x04CF COLLATE ucs2_unicode_ci));
    +----------------------------------------------------------+
    | HEX(WEIGHT_STRING(_ucs2 0x04CF COLLATE ucs2_unicode_ci)) |
    +----------------------------------------------------------+
    | FBC084CF                                                 |
    +----------------------------------------------------------+
    

    因此,U+04cf CYRILLIC SMALL LETTER PALOCHKA是的,所有的UCA 4.0.0排序规则,大于自行车赛. 与UCA 5.2.0胶粘相结合,全帕洛奇卡都在一起。

  • 补充字符一般排序规则、重量的重量0xfffd REPLACEMENT CHARACTER。补充字符在UCA 4.0.0排序规则,他们整理的重量0xfffd。那是,MySQL,所有补充字符相等,且大于几乎所有BMP字符。

    例字和修COUNT(DISTINCT)

    创建表的T(S1 varchar(五)字符集utf32整理utf32_unicode_ci);插入T值(0xfffd);/ * * /替换字符插入T值(0x010412);/*该资本信蜂* /插入T值(0x010413);/*该大写字母T恤* /选择计数(不同的S1)T;

    结果是2,因为在MySQLxxx_unicode_ci排序规则,替换字符具有重纽约,而该蜂和犹他TEE都有重量0xfffd。(是我们utf32 _通用_整理代替,结果是1,因为所有的三个字符有重量0xfffd在整理。)

    例,楔形文字和WEIGHT_STRING()

    / *四个字符的字符串插入are00000041 #大写拉丁字母a0001218f #楔形符号kab000121a7 #楔形符号kish00000042 #拉丁文大写字母B * /创建表(S1 char(4)字符集utf32整理utf32_unicode_ci);插入T值(0x000000410001218f000121a700000042);选择HEX(weight_string(S1))T;

    其结果是:

    0E33 FFFD FFFD 0E4A
    

    0E330e4a是主要的权重为UCA 4.0.0FFFD是重量KAB也是基什。

    所有补充字符相等的规则是非最佳但预计不会造成麻烦。这些人物都是非常罕见的,所以这是非常罕见的,一个多字符串完全由补充字符。在日本,由于补充字符模糊汉字表意文字,典型的用户并不关心他们是在什么样的顺序,反正。如果你真的想要行MySQL规则排序其次代码点的价值,它是容易的:

    ORDER BY s1 COLLATE utf32_unicode_ci, s1 COLLATE utf32_bin
    
  • 基于均匀圆阵的版本高于4.0.0补充字符(例如,xxx_unicode_520_ci),补充字符不一定都有相同的排序权重。有明确的权重从UCAallkeys.txt文件有人从这个算法计算权重:

    aaaa= base +  (code >> 15);
    bbbb= (code & 0x7FFF) | 0x8000;
    

是有区别的排序字符的码值排序的字符的二进制表示,只有出现差异utf16_bin,因为代理人

假设utf16_bin(二进制排序规则UTF16)是一个二进制的比较逐字节而不是按字符如果是这样的话,人物的顺序utf16_bin将不同的顺序UTF8。例如,下面的图表显示了两个生僻字。第一个字符的范围是E000FFFF,所以它是大于替代但小于补充。第二个特点是补充。

Code point  Character                    utf8         utf16
----------  ---------                    ----         -----
0FF9D       HALFWIDTH KATAKANA LETTER N  EF BE 9D     FF 9D
10384       UGARITIC LETTER DELTA        F0 90 8E 84  D8 00 DF 84

图中的两个字符的编码值,因为0xff9d<0x10384。他们是以utf8价值因为0xef<0xf0。但他们不是以UTF16值,如果我们用逐字节的比较,因为0xff&#62;0xd8

所以MySQL的utf16_bin整理不逐字节它是通过代码点当MySQL看到增补字符编码utf16,它转换为字符的编码值,然后比较。因此,UTF8utf16_bin是相同的排序。这是与SQL相一致:2008标准要求ucs_basic整理:ucs_basic是整理,排序的字符串排序的字符的Unicode标量值完全确定。它适用于UCS字符集。由于每个字符集是UCS的剧目的一个子集,整理的ucs_basic是每个字符集可能适用。注11:一个字符的Unicode标量值的代码点视为一个无符号整数。

如果字符集ucs2,比较是字节的字节,但UCS2字符串不能包含的代理人,无论如何。

10.10.2西欧字符集

西欧字符集涵盖了大部分的西欧语言,如法语、西班牙语、加泰罗尼亚语、葡萄牙语、意大利语,巴斯克,阿尔巴尼亚,荷兰,德国,丹麦,瑞典,挪威、芬兰、Faroese、冰岛、爱尔兰、苏格兰、和英语。

  • ascii(ASCII)排序规则:

    • ascii_bin

    • ascii_general_ci(默认)

  • cp850(DOS西欧)排序规则:

    • cp850_bin

    • cp850_general_ci(默认)

  • dec8(12月西欧)排序规则:

    • dec8_bin

    • dec8_swedish_ci(默认)

  • hp8(惠普西欧)排序规则:

    • hp8_bin

    • hp8_english_ci(默认)

  • latin1(cp1252西欧)排序规则:

    • latin1_bin

    • latin1_danish_ci

    • latin1_general_ci

    • latin1_general_cs

    • latin1_german1_ci

    • latin1_german2_ci

    • latin1_spanish_ci

    • latin1_swedish_ci(默认)

    latin1是默认的字符集。MySQL的latin1就像Windows一样cp1252字符集。这意味着它是作为官方一样ISO 8859-1或IANA(互联网数字分配机构)latin1,除了IANAlatin1将代码点之间0x800x9f作为未定义,cp1252因此,与MySQL的latin1这些职位,分配角色。例如,0x80是欧元标志。对于未定义条目cp1252翻译,MySQL0x81Unicode0x00810x8d0x008d0x8f0x008f0x900x0090,和0x9d0x009d

    这个latin1_swedish_ci排序是默认的,可能是由广大客户使用MySQL。虽然人们常说,它是基于瑞典和芬兰的排序规则,有人不同意这种说法的瑞典人和芬兰人。

    这个latin1_german1_ci用_ german2 _以下排序规则是基于din-1和din-2标准DIN代表德国标准化研究所(ANSI德国相当)。din-1叫做collation词典和din-2叫做电话簿整理对于这个在比较或做搜索时的一个例子,看第10.8.6,“整理”效应的例子

    • latin1_german1_ci(字典)规则:

      ? = A? = Oü = U? = s
    • latin1_german2_ci(电话簿)规则:

      ? = AE? = OEü = UE? = ss

    latin1_spanish_ci整理,?(n-tilde)之间的一个单独的信no

  • macroman(MAC的西欧)排序规则:

    • macroman_bin

    • macroman_general_ci(默认)

  • swe7(7bit瑞典)排序规则:

    • swe7_bin

    • swe7_swedish_ci(默认)

10.10.3中欧字符集

MySQL提供了用于在捷克共和国,斯洛伐克,匈牙利,罗马尼亚,斯洛文尼亚,克罗地亚,波兰和塞尔维亚的一些支持的字符集(拉丁语)。

  • cp1250(Windows中欧)排序规则:

    • cp1250_bin

    • cp1250_croatian_ci

    • cp1250_czech_cs

    • cp1250_general_ci(默认)

    • cp1250_polish_ci

  • cp852(DOS中欧)排序规则:

    • cp852_bin

    • cp852_general_ci(默认)

  • keybcs2(Dos Kammeniko Czech - Slovak)Collation:

    • keybcs2_bin

    • keybcs2_general_ci(默认)

  • latin2(ISO 8859-2中欧)排序规则:

    • latin2_bin

    • latin2_croatian_ci

    • latin2_czech_cs

    • latin2_general_ci(默认)

    • latin2_hungarian_ci

  • macce(MAC中欧)排序规则:

    • macce_bin

    • macce_general_ci(默认)

10.10.4欧洲南部和中东的字符集

欧洲南部和中东的字符集支持MySQL包括亚美尼亚语,阿拉伯语,希伯来语,格鲁吉亚,希腊和土耳其。

  • armscii8(armscii-8亚美尼亚)排序规则:

    • armscii8_bin

    • armscii8_general_ci(默认)

  • cp1256(Windows排序规则阿拉伯):

    • cp1256_bin

    • cp1256_general_ci(默认)

  • geostd8(geostd8格鲁吉亚)排序规则:

    • geostd8_bin

    • geostd8_general_ci(默认)

  • greek(ISO 8859-7希腊)排序规则:

    • greek_bin

    • greek_general_ci(默认)

  • hebrew(ISO 8859-8希伯来文)排序规则:

    • hebrew_bin

    • hebrew_general_ci(默认)

  • latin5(ISO 8859-1(9):土耳其)的排序规则。

    • latin5_bin

    • latin5_turkish_ci(默认)

10.10.5波罗的字符集

波罗的海的字符集覆盖爱沙尼亚、拉脱维亚和立陶宛语言。

  • cp1257(Windows排序规则的波罗的海):

    • cp1257_bin

    • cp1257_general_ci(默认)

    • cp1257_lithuanian_ci

  • latin7(ISO 8859-13波罗的海)的排序规则:

    • latin7_bin

    • latin7_estonian_cs

    • latin7_general_ci(默认)

    • latin7_general_cs

10.10.6西里尔字符集

西里尔字符集和排序规则使用白俄罗斯,保加利亚、俄罗斯、乌克兰、塞尔维亚(西里尔)语言。

  • cp1251(Windows西里尔)排序规则:

    • cp1251_bin

    • cp1251_bulgarian_ci

    • cp1251_general_ci(默认)

    • cp1251_general_cs

    • cp1251_ukrainian_ci

  • cp866(DOS俄罗斯)排序规则:

    • cp866_bin

    • cp866_general_ci(默认)

  • koi8r(koi8-r RelCom俄罗斯)排序规则:

    • koi8r_bin

    • koi8r_general_ci(默认)

  • koi8u(koi8-u乌克兰)的排序规则:

    • koi8u_bin

    • koi8u_general_ci(默认)

10.10.7亚洲字符集

亚洲字符集,我们支持包括中国、日本、韩国、泰国。这些可以是复杂的。例如,中国必须允许数千个不同的字。看到第10.10.7.1,“集”的cp932字符有关更多信息,cp932SJIS字符集。看到第10.10.7.2,“集”的GB18030字符,约为中国国家标准GB 18030字符集支持的附加信息。

回答一些常见的问题和相关问题在MySQL亚洲字符集的支持,看到第A.11,MySQL 5.0 FAQ:MySQL中文,日语,韩语字符集”

  • big5(BIG5繁体中文)排序规则:

    • big5_bin

    • big5_chinese_ci(默认)

  • cp932(SJIS Windows排序规则的日本):

    • cp932_bin

    • cp932_japanese_ci(默认)

  • eucjpms(ujis Windows排序规则的日本):

    • eucjpms_bin

    • eucjpms_japanese_ci(默认)

  • euckr(euc-kr韩国)排序规则:

    • euckr_bin

    • euckr_korean_ci(默认)

  • gb2312(GB2312简体中文)排序规则:

    • gb2312_bin

    • gb2312_chinese_ci(默认)

  • gbk(简体中文GBK)排序规则:

    • gbk_bin

    • gbk_chinese_ci(默认)

  • gb18030(中国国家标准GB18030)排序规则:

    • gb18030_bin

    • gb18030_chinese_ci(默认)

    • gb18030_unicode_520_ci

  • sjis(Shift JIS日本)排序规则:

    • sjis_bin

    • sjis_japanese_ci(默认)

  • tis620(tis620泰国)的排序规则:

    • tis620_bin

    • tis620_thai_ci(默认)

  • ujis(日文日文)排序规则:

    • ujis_bin

    • ujis_japanese_ci(默认)

这个big5_chinese_ci整理各种笔画数

10.10.7.1的cp932字符集

为什么cp932需要吗?

在MySQL的sjis字符集对应的_ Shift JIS字符集定义由IANA,支持日本x0201和JIS x0208字符。(见http://www.iana.org/assignments/character-sets。)

然而,意义Shift-JIS作为一个描述性的词变得很模糊,它通常包括扩展Shift_JIS这是由不同的供应商定义。

例如,Shift-JIS在日本是微软推广Windows环境Shift_JIS其确切的名称是微软的Windows代码页:932cp932。除了支持的字符_ Shift JIScp932支持扩展字符如NEC的特殊字符,NEC选择IBM扩展字符,和IBM选定的字符。

许多日本用户遇到使用这些扩展字符。这些问题来自于以下几个因素:

  • MySQL的自动转换字符集。

  • 字符集转换使用Unicode(ucs2

  • 这个sjis字符集不支持这些扩展字符的转换。

  • 有几家所谓的转换规则Shift-JISUnicode,和一些字符转换为Unicode不同的转换规则。MySQL只支持其中的一个规则(稍后介绍)。

MySQLcp932字符集是设计来解决这些问题。

因为MySQL支持的字符集转换,它是单独的IANA重要Shift_JIScp932为两个不同的字符集,因为它们提供了不同的转换规则。

如何cp932differ fromSJIS

这个cp932字符集不同于SJIS在以下几个方面:

一些字符,转换和从ucs2是不同的SJIScp932。下表描述了这些差异。

转换ucs2

sjis/cp932价值sjis-&#62;UCS2转换cp932-&#62;UCS2转换
5C005c005c
7E007e007e
815c二千零一十五二千零一十五
815f005cff3c
八千一百六十301cff5e
八千一百六十一二千零一十六二千二百二十五
817c二千二百一十二ff0d
八千一百九十一00a2ffe0
八千一百九十二00a3ffe1
81ca00acffe2

转换ucs2

ucs2价值ucs2-&#62;SJIS转换ucs2-&#62;cp932转换
005c815f5C
007e7E7E
00a2八千一百九十一3F
00a3八千一百九十二3F
00ac81ca3F
二千零一十五815c815c
二千零一十六八千一百六十一3F
二千二百一十二817c3F
二千二百二十五3F八千一百六十一
301c八千一百六十3F
ff0d3F817c
ff3c3F815f
ff5e3F八千一百六十
ffe03F八千一百九十一
ffe13F八千一百九十二
ffe23F81ca

对日本的任何字符集的用户应该知道,使用--character-set-client-handshake(或--skip-character-set-client-handshake)有重要影响。看到第5.1.6、“服务器选项”

10.10.7.2 GB18030字符集

在MySQL的gb18030字符集对应的中国国家标准GB 18030-2005:信息技术?-?汉字编码字符集,是中华人民共和国的官方文字(PRC)。

对MySQL GB18030字符集的特点
  • 支持所有的编码点的GB 18030-2005标准定义。在未分配的代码点范围(GB 8431a439,国标(GB e3329a36,90308130)和GB ef39ef39)被视为&#39;?“(0x3f)。未赋值的代码点返回转换”&#39;

  • 支持所有GB18030编码的上下转换点。折盒由Unicode也支持(基于CaseFolding-6.3.0.txt

  • 支持数据转换与其他字符集。

  • 支持SQL语句等SET NAMES

  • 支持比较gb18030字符串之间gb18030字符串和其他字符集的字符串。如果字符串有不同的字符集有一个转换。比较包括或忽略尾随空格也支持。

  • 私人使用区(U开机,你f8ff)在Unicode映射到gb18030

  • 没有之间的映射(U D800,U DFFF)和GB18030。尝试转换代码点范围内的回报”?&#39;

  • 如果输入序列是非法的,错误或警告的返回。如果一个序列是非法使用CONVERT(),则返回一个错误。否则,返回的警告。

  • 对于一致性utf8utf8mb4不支持连写,上

  • 连写大写连字也匹配搜索时使用gb18030_unicode_520_ci整理

  • 如果一个角色有多个大写字母,大写字母的选择是一个小写字符本身。

  • 最低字节长度为1,最大的是4。字符集确定长度的序列使用第一个或两个字节。

支持的排序规则
  • gb18030_bin二进制排序规则

  • gb18030_chinese_ci:默认排序规则,支持拼音。非汉字排序是基于原来的排序键的顺序。原来的排序关键字GB(上(CH))如果UPPER(ch)存在.否则,原有的排序关键字GB(CH)。汉字根据Unicode常见的现场数据库定义的拼音排序规则排序(cldr 24)。非汉字排序前汉字除GB+FE39FE39,这是编码的最大

  • gb18030_unicode_520_ciUnicode排序规则。如果你需要确保连字排序正确使用该整理。

10.10.8二进制字符集

这个binary字符集的二进制字符串的字符,这是字节序列。这个二元的字符集有一个整理,也叫binary。比较和排序是基于数字的字节值。效果是lettercase和口音差异比较明显。那是的二元的整理是区分大小写的区分重音。

mysql> SET NAMES 'binary';
mysql> SELECT CHARSET('abc'), COLLATION('abc');
+----------------+------------------+
| CHARSET('abc') | COLLATION('abc') |
+----------------+------------------+
| binary         | binary           |
+----------------+------------------+
mysql> SELECT 'abc' = 'ABC', 'a' = '?';
+---------------+------------+
| 'abc' = 'ABC' | 'a' = '?'  |
+---------------+------------+
|             0 |          0 |
+---------------+------------+

约之间的差异信息binary整理的二元的字符集和_bin多进制字符集的排序规则,看第10.8.5“二进制排序规则相比,_bin排序规则”

将一个字符串表达式的二进制字符串,任何这些结构是等价的:

BINARY expr
CAST(expr AS BINARY)
CONVERT(expr USING BINARY)

如果expr是一个字符串,该_binary介绍人可用于指定为二进制字符串。例如:

_binary 'a'

这个_binary介绍人是进制文字和位值以及允许的文字,但不必要的;这样的文字是二进制字符串默认。

关于开拓者的更多信息,参见第10.3.8,“字符集范围”

10.11设置错误消息的语言

默认情况下,mysqld产生于英语的错误信息,但它们可以显示在任何其他几种语言:捷克,丹麦,荷兰,Estonian,法国,德国,希腊,匈牙利,意大利,日本,韩国,挪威,挪威纽约,波兰语,葡萄牙语,罗马尼亚,俄罗斯,斯洛伐克,西班牙,瑞典。这适用于邮件服务器写入错误日志并发送给客户。

选择语言,服务器写入错误信息,按照本节中的说明。有关更改设置的错误信息的字符信息(而不是语言),见10.6节,“错误信息字符集”。有关配置错误日志记录的一般信息,看5.4.2部分,“错误日志”

使用这些规则的错误信息文件服务器搜索:

  • 看起来在两个系统变量的值建立了一个目录的文件,lc_messages_dirlc_messages,后者转换为语言的名字。假设你启动服务器使用这个命令:

    mysqld --lc_messages_dir=/usr/share/mysql --lc_messages=fr_FR

    在这种情况下,mysqld图现场fr_FR的语言法语看起来在错误文件/usr/share/mysql/french目录

    默认情况下,语言文件位于share/mysql/LANGUAGEMySQL库目录下的目录。

  • 如果消息文件无法在目录构造如刚才所描述的发现,服务器忽略lc_messages价值和只使用lc_messages_dir值的位置看

  • 如果服务器无法找到配置信息文件,它将消息写入错误日志表明,拖欠问题的内置的英文信息。

这个lc_messages_dir系统变量只能被设置在服务器启动时,只有一个全局只读的值在运行时。lc_messages可设置在服务器启动和具有全局和会话的值可以在运行时修改。因此,错误消息的语言可以在服务器运行的变化,和每个客户端可以通过设置会话有其自己的错误信息的语言lc_messages所需的区域名称值。例如,如果服务器使用fr_fr错误信息的地方,一个客户端可以执行该语句在英语中收到错误信息:

SET lc_messages = 'en_US';

10.12添加一个字符集

本节讨论添加字符集到MySQL的程序。正当程序取决于字符集是简单的或是复杂的:

  • 如果字符集不需要特殊的字符串排序例程排序不需要多字节字符的支持,它是简单的。

  • 如果字符集需要的这些功能,它是复杂的。

例如,greekswe7简单的字符集,而big5捷克复杂的字符集

使用下面的说明,你必须有一个MySQL源分布。在指令,MYSET代表人物设置要添加的名称。

  1. 添加一个<charset>MYSETSQL /分享/字符集/ Index.xml文件在文件中使用的现有内容为指导,增加新的内容。对于部分上市latin1<charset>元素如下:

    <charset name="latin1">
      <family>Western</family>
      <description>cp1252 West European</description>
      ...
      <collation name="latin1_swedish_ci" id="8" order="Finnish, Swedish">
        <flag>primary</flag>
        <flag>compiled</flag>
      </collation>
      <collation name="latin1_danish_ci" id="15" order="Danish"/>
      ...
      <collation name="latin1_bin" id="47" order="Binary">
        <flag>binary</flag>
        <flag>compiled</flag>
      </collation>
      ...
    </charset>
    

    这个<charset>元素必须为字符集的排序列表。这些必须包含至少一个二进制排序规则和默认(初级)整理。默认的排序规则是经常使用后缀命名我们总_(一般,不区分大小写)。为默认的排序规则的二进制排序规则是可以的,但通常是不同的。默认排序规则应该有一个primary国旗。“应该有一个二元collation二元的标志

    你必须分配一个唯一的ID号每整理。从1024到2047的ID的范围是保留给用户自定义的排序规则。发现目前使用的排序规则ID最大值,使用此查询:

    SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;
    
  2. 这一步取决于你是否添加一个简单的或复杂的字符集。一个简单的字符集,只需要一个配置文件,而一个复杂的字符集要求的C源文件,定义了排序功能,多字节的功能,或两者。

    一个简单的字符集,创建一个配置文件,MYSET.xml,说明字符集的性质。在创建该文件SQL /分享/字符集目录你可以使用一份latin1.xml作为该文件的基础。该文件的语法很简单:

    • 评论写的都是普通的XML注释(<!-- text -->

    • 关键词内<map>数组中的元素是由任意数量的空白分隔。

    • 每个字内<map>数组元素必须是十六进制格式的数。

    • 这个<map>对数组元素<ctype>元素有257字。其他的<map>数组元素之后,有256个字。看到第10.12.1,”角色定义数组”

    • 对于列在每个整理<charset>集在字符单元index.xmlMYSET.xml必须包含一个<collation>元素定义的字符排序

    对于一个复杂的字符集,创建一个C源文件描述字符集的性质和定义了支持程序正确执行操作的字符集:

  3. 修改配置信息。利用现有的配置信息为指导,添加信息MYSYS。这里的示例假定已默认字符集和二进制排序规则,但更多的线是必要的如果MYSET有额外的零食

    1. 编辑mysys/charset-def.c,和注册为新的字符集的排序规则。

      增加这些线路的宣言部分:

      #ifdef HAVE_CHARSET_MYSET
      extern CHARSET_INFO my_charset_MYSET_general_ci;
      extern CHARSET_INFO my_charset_MYSET_bin;
      #endif
      

      增加这些线路的注册部分:

      #ifdef HAVE_CHARSET_MYSET
        add_compiled_collation(&my_charset_MYSET_general_ci);
        add_compiled_collation(&my_charset_MYSET_bin);
      #endif
      
    2. 如果字符集使用ctype-MYSET.c,编辑字符串/ CMakeLists.txt并添加ctype-MYSET.c的定义动力来源变量

    3. 编辑cmake/character_sets.cmake

      1. 添加MYSET的值与charsets_available按字母顺序

      2. 添加MYSET的价值charsets_complex按字母顺序。这是即使是简单的字符集,或CMake不承认-DDEFAULT_CHARSET=MYSET

  4. 配置、编译、测试

10.12.1字符定义数组

每一个简单的字符集有一个配置文件位于sql/share/charsets目录一个字符集命名MYSYS,该文件的名称MYSETXML。它使用<map>数组元素的字符集属性列表。<map>在这些元素的元素:

  • <ctype>定义每个角色属性

  • <lower><upper>小写和大写字符列表

  • <unicode>图8位字符的Unicode值的值。

  • <collation>元素显示字符比较和排序顺序,每整理一元。二进制排序规则不需要<map>元因为字符代码本身提供订购。

对于一个复杂的字符集中实现ctype-MYSET.c文件在字符串目录,有相应的阵列:ctype_MYSET[]到下_ _MYSET[ ],等等。不是每一个复杂的字符集有所有的阵列。又见存在CTME - C . C文件的例子。看到CHARSET_INFO.txt文件在字符串补充资料目录

大多数的阵列由特征值和索引有256个要素。这个<ctype>阵列的特征值索引和有257元素。这是一种处理遗产公约EOF

<ctype>数组元素的位值。每个元素描述的字符一个字符集属性。每个属性是一位有关,定义包括/ m_ctype。H

#define _MY_U   01      /* Upper case */
#define _MY_L   02      /* Lower case */
#define _MY_NMR 04      /* Numeral (digit) */
#define _MY_SPC 010     /* Spacing character */
#define _MY_PNT 020     /* Punctuation */
#define _MY_CTR 040     /* Control character */
#define _MY_B   0100    /* Blank */
#define _MY_X   0200    /* heXadecimal digit */

这个<ctype>对于一个给定的字符应该是形容人的性格的适用的位掩码值联盟价值。例如,&#39; &#39;是一个大写字母(_MY_U)以及一个十六进制数字(_my_x),所以它的ctype价值应该是这样定义的:

ctype['A'+1] = _MY_U | _MY_X = 01 | 0200 = 0201

的位掩码值m_ctype.h八进制值,但元素的<ctype>阵列MYSET.xml应该写成十六进制值

这个<lower><upper>阵列有小写和大写字符对应的字符集的每个成员。例如:

lower['A'] should contain 'a'
upper['a'] should contain 'A'

每个<collation>数组说明文字应有序进行比较和排序。MySQL的各种特征基于这些信息的价值。在某些情况下,这是一样的<upper>数组排序,这意味着不区分大小写。对于更复杂的排序规则(复杂的字符集),看到字符串整理的讨论第10.12.2,”字符串排序支持复杂的字符集”

10.12.2字符串排序复杂字符集支持

一个简单的字符集命名MYSET,排序规则中指定的MYSETXML配置文件的使用<map>数组元素内<collation>元素如果排序规则你的语言太复杂而无法处理简单的数组,你必须定义字符串排序的功能c型MYSETC在源文件字符串目录

现有的字符集提供最好的文档和例子来说明这些功能的实现。看看ctype-*.c文件在字符串目录,例如文件big5捷克gbkSJIS,和tis160字符集。看一看我的拼贴画结构,看看它们是如何使用的。又见CHARSET_INFO.txt文件在字符串补充资料目录

10.12.3多字节字符支持复杂的字符集

如果你想添加一个新的字符支持设置命名MYSET这包括多字节字符,你必须在使用多字节字符的功能c型MYSETC在源文件字符串目录

现有的字符集提供最好的文档和例子来说明这些功能的实现。看看ctype-*.c文件在字符串目录,例如文件euc_krgb2312gbkSJIS,和ujis字符集。看一看my_charset_handler结构,看看它们是如何使用的。又见CHARSET_INFO.txt文件在字符串补充资料目录

10.13添加整理到一个字符集

排序规则是一套规则,定义了如何比较和排序字符串。在MySQL数据库中每个整理属于单个字符集。每个字符集至少有一个排序,最有两个或两个以上的排序规则。

整理订单特征权重的基础上的。在一个字符每个字符集映射到一个重。与同等重量的字符相等,根据其权重的相对大小不等权重比较和特征。

这个WEIGHT_STRING()函数可以用来看权重字符串中的字符。它还表明权重值是一个二进制字符串,便于使用六(weight_string(str))在打印的表格显示的重量。下面的示例显示重量相差不在字母lettercase“AABB”如果它是一个二进制字符串,但也有所不同,如果它是一个二进制字符串:

mysql> SELECT HEX(WEIGHT_STRING('AaBb' COLLATE latin1_swedish_ci));
+------------------------------------------------------+
| HEX(WEIGHT_STRING('AaBb' COLLATE latin1_swedish_ci)) |
+------------------------------------------------------+
| 41414242                                             |
+------------------------------------------------------+
mysql> SELECT HEX(WEIGHT_STRING(BINARY 'AaBb'));
+-----------------------------------+
| HEX(WEIGHT_STRING(BINARY 'AaBb')) |
+-----------------------------------+
| 41614262                          |
+-----------------------------------+

MySQL支持几种排序的实现,讨论第10.13.1”collation实施类型”。这些可以被添加到MySQL无需重新编译:

  • 8位字符集简单的排序规则。

  • Unicode字符集的UCA的排序规则。

  • Binary(xxx_bin()粘贴

以下各节描述如何添加前两种类型的排序规则,现有的字符集。所有现有的字符集已经有一个二进制排序规则,所以这里没有必要描述如何添加一个。

总结的过程:一个新的collation增

  1. 选择一个排序规则的ID。

  2. 添加配置信息:名字的整理和描述字符的排序规则。

  3. 重新启动服务器

  4. 验证是目前整理

这里的指令只覆盖了排序规则,可以添加没有编译MySQL。添加一个排序规则,不需要重新编译(由c源文件中函数实现),使用说明10.12节,“添加一个字符集”。然而,而不是添加一个完整的字符集所需要的信息,只需修改相应的文件为一个现有的字符集。这是基于已经存在的字符集的排序规则,添加的数据结构、功能,并为新的排序规则配置信息。

笔记

如果你修改一个现有的排序规则,这可能会影响对列使用排序指标排序。在这种情况下,重建任何这样的指标等问题,避免不正确的查询结果。看到第2.10.3,“重建或修复表或索引”

额外资源

10.13.1 collation执行类型

MySQL实现排序的几种类型:

8位字符集简单的排序规则

这种整理是利用256重定义一个一对一映射的字符码到权重数组实现。latin1_swedish_ci就是一个例子。这是一个不区分大小写的排序,所以大写和小写字符版本有相同的重量和他们相等的。

MySQL的&#62;SET NAMES 'latin1' COLLATE 'latin1_swedish_ci';查询好,为受影响的行(0.01秒)MySQL &#62;SELECT HEX(WEIGHT_STRING('a')), HEX(WEIGHT_STRING('A'));------------------------- ------------------------- | hex(weight_string(A))| hex(weight_string(A))| ------------------------- ------------------------- | 41 | 41 | ------------------------- ------------------------- 1行集(0.01秒)MySQL &#62;SELECT 'a' = 'A';+-----------+| 'a' = 'A' |+-----------+|         1 |+-----------+1 row in set (0.12 sec)

执行指令,看第10.13.3,”添加一个简单的排序规则设置“8位字符

8位字符集复杂的排序规则

这种整理是实现使用功能的C源文件,定义如何为特征,如10.12节,“添加一个字符集”

不支持多字节字符集的排序规则

这种类型的整理,8位(单字节和多字节字符)进行不同的处理。8位字符,字符码映射到权重大小写不敏感的时尚。(例如,单字节字符'a'&#39; &#39;都有一个重量0x41多字节字符。),有两种类型的字符编码和重量之间的关系:

  • 重量相等的字符码sjis_japanese_ci正是这种整理实例。多字节字符狐狸&#39; &#39;有一个字符编码0x82C0,和重量也0x82c0

    mysql> CREATE TABLE t1
           (c1 VARCHAR(2) CHARACTER SET sjis COLLATE sjis_japanese_ci);
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> INSERT INTO t1 VALUES ('a'),('A'),(0x82C0);
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
    +------+---------+------------------------+
    | c1   | HEX(c1) | HEX(WEIGHT_STRING(c1)) |
    +------+---------+------------------------+
    | a    | 61      | 41                     |
    | A    | 41      | 41                     |
    | ぢ    | 82C0    | 82C0                   |
    +------+---------+------------------------+
    3 rows in set (0.00 sec)
    
  • 字符代码的地图一对一的重量,但是代码不一定等于重量。gbk_chinese_ci正是这种整理实例。多字节字符&#39;膰&#39;有一个字符编码0x81B0但重量0xc286

    mysql> CREATE TABLE t1
           (c1 VARCHAR(2) CHARACTER SET gbk COLLATE gbk_chinese_ci);
    Query OK, 0 rows affected (0.33 sec)
    
    mysql> INSERT INTO t1 VALUES ('a'),('A'),(0x81B0);
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
    +------+---------+------------------------+
    | c1   | HEX(c1) | HEX(WEIGHT_STRING(c1)) |
    +------+---------+------------------------+
    | a    | 61      | 41                     |
    | A    | 41      | 41                     |
    | 膰    | 81B0    | C286                   |
    +------+---------+------------------------+
    3 rows in set (0.00 sec)
    

执行指令,看10.12节,“添加一个字符集”

多字节字符集Unicode排序规则

这些排序规则是基于Unicode排序算法(UCA),别人都不。

非均匀圆阵的排序规则有一个从字符代码重映射。在MySQL数据库中,这样的排序规则是不区分大小写,不区分重音。utf8_general_ci就是一个例子:&#39; &#39;'A'“à”,和'á'每个人都有不同的字符码但都有重量0x0041和相等的

mysql> SET NAMES 'utf8' COLLATE 'utf8_general_ci';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE t1
       (c1 CHAR(1) CHARACTER SET UTF8 COLLATE utf8_general_ci);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t1 VALUES ('a'),('A'),('à'),('á');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
+------+---------+------------------------+
| c1   | HEX(c1) | HEX(WEIGHT_STRING(c1)) |
+------+---------+------------------------+
| a    | 61      | 0041                   |
| A    | 41      | 0041                   |
| à    | C380    | 0041                   |
| á    | C3A1    | 0041                   |
+------+---------+------------------------+
4 rows in set (0.00 sec)

UCA的排序规则在MySQL中有这些属性:

  • 如果一个角色有重量,每个重量使用2个字节(16位)。

  • 一个字可以有零权重(或重量)。在这种情况下,人物是可以忽略的。例如:“0000空”没有重量,可忽略。

  • 一个字可以有一个重量。例子:'a'有一个重0x0e33

    mysql> SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> SELECT HEX('a'), HEX(WEIGHT_STRING('a'));
    +----------+-------------------------+
    | HEX('a') | HEX(WEIGHT_STRING('a')) |
    +----------+-------------------------+
    | 61       | 0E33                    |
    +----------+-------------------------+
    1 row in set (0.02 sec)
    
  • 一个字可以有很多的重量。这是一个扩展。例如:德国的信'?'(深圳结扎,或尖锐的)有一个重量0x0fea0fea

    mysql> SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';
    Query OK, 0 rows affected (0.11 sec)
    
    mysql> SELECT HEX('?'), HEX(WEIGHT_STRING('?'));
    +-----------+--------------------------+
    | HEX('?')  | HEX(WEIGHT_STRING('?'))  |
    +-----------+--------------------------+
    | C39F      | 0FEA0FEA                 |
    +-----------+--------------------------+
    1 row in set (0.00 sec)
    
  • 许多角色都可能有一个重量。这是一个收缩。例子:'ch'在捷克的一封信,有一个重量0x0ee2

    mysql> SET NAMES 'utf8' COLLATE 'utf8_czech_ci';
    Query OK, 0 rows affected (0.09 sec)
    
    mysql> SELECT HEX('ch'), HEX(WEIGHT_STRING('ch'));
    +-----------+--------------------------+
    | HEX('ch') | HEX(WEIGHT_STRING('ch')) |
    +-----------+--------------------------+
    | 6368      | 0EE2                     |
    +-----------+--------------------------+
    1 row in set (0.00 sec)
    

一个多字多权重映射也是可能的(这是收缩与膨胀),但不支持MySQL。

为执行指示,为非UCA粘贴,See,for implementation instructions,for a non - uca sholling,see10.12节,“添加一个字符集”. 上一篇:一个UCA Collation,see .第10.13.4,”添加一个UCA整理Unicode字符集”

各种排序规则

也有一些企业不属于任何一类。

10.13.2选择整理ID

每个整理必须添加一个整理一个独特的ID.,你必须选择一个ID值是当前未使用。MySQL支持两字节排序规则的入侵检测系统。从1024到2047的ID的范围是保留给用户自定义的排序规则。整理你的身份证,选择将出现在这些环境中:

确定最大目前使用的ID,发表如下声明:

mysql> SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;
+---------+
| MAX(ID) |
+---------+
|     210 |
+---------+

显示所有目前使用的ID,发布这个声明:

mysql> SELECT ID FROM INFORMATION_SCHEMA.COLLATIONS ORDER BY ID;
+-----+
| ID  |
+-----+
|   1 |
|   2 |
| ... |
|  52 |
|  53 |
|  57 |
|  58 |
| ... |
|  98 |
|  99 |
| 128 |
| 129 |
| ... |
| 210 |
+-----+
警告

在升级之前,你应该保存配置文件的更改。如果你在升级过程中,会取代你的修改的文件。

10.13.3添加一个简单的整理到一个8位字符集

本节介绍了如何添加设置通过写一个8位字符的简单整理<collation>与一个元素<charset>在MySQL字符集的描述Index.xml文件这里描述的步骤,不需要重新编译MySQL。该示例将一个整理命名我们测试_ _ latin1latin1字符集

  1. 选择一个排序规则的ID,如图所示第10.13.2,选择“排序规则ID”。以下步骤使用1024个ID。

  2. 修改Index.xmllatin1.xml配置文件。这些文件位于目录命名的character_sets_dir系统变量。你可以检查变量的值如下,虽然路径名可能在您的系统上的不同:

    MySQL的&#62;SHOW VARIABLES LIKE 'character_sets_dir';| -------------------- ----------------------------------------- _ name值变| | -------------------- ----------------------------------------- |字符集_ _ | /用户/地方/目录/分享/ MySQL / MySQL / | charsets ----------------------------------------- --------------------
  3. 选择在整理列表名称Index.xml文件找到<charset>集,整理被添加的特征元素,并添加一个<collation>元素显示排序规则名称和ID,将名字与ID,例如:

    <charset name="latin1">  ...  <collation name="latin1_test_ci" id="1024"/>  ...</charset>
  4. latin1.xml配置文件,添加一个<collation>元素名称的整理和包含<map>元素定义了一个字符代码字符码0到255重映射表。在每个值<map>元素必须是十六进制格式的数。

    <collation name="latin1_test_ci">
    <map>
     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
     10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
     20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
     30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
     40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
     50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
     60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
     50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F
     80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
     90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
     A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
     B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
     41 41 41 41 5B 5D 5B 43 45 45 45 45 49 49 49 49
     44 4E 4F 4F 4F 4F 5C D7 5C 55 55 55 59 59 DE DF
     41 41 41 41 5B 5D 5B 43 45 45 45 45 49 49 49 49
     44 4E 4F 4F 4F 4F 5C F7 5C 55 55 55 59 59 DE FF
    </map>
    </collation>
    
  5. 重新启动服务器,并使用这个语句来验证整理存在:

    mysql> SHOW COLLATION WHERE Collation = 'latin1_test_ci';
    +----------------+---------+------+---------+----------+---------+
    | Collation      | Charset | Id   | Default | Compiled | Sortlen |
    +----------------+---------+------+---------+----------+---------+
    | latin1_test_ci | latin1  | 1024 |         |          |       1 |
    +----------------+---------+------+---------+----------+---------+
    

10.13.4加入UCA整理到一个Unicode字符集

本节介绍了如何添加一个UCA整理一个Unicode字符集的写作<collation>元素内<charset>在MySQL字符集的描述Index.xml文件这里描述的步骤,不需要重新编译MySQL。采用现场数据标记语言的一个子集(LDML)规范,这是在www.unicode.org http:/ / / / /报告tr35。用这种方法,你不需要定义整个整理。相反,你开始与现有的基地整理和描述它如何不同于基础整理方面的新排序规则。下表列出了基地校的Unicode字符集,UCA的排序规则可以定义。它是不可能创建用户定义的排序规则为UCAutf16le;没有我们_ utf16le _ Unicode整理,将作为排序的依据等。

表10.4 MySQL字符集可供用户定义的UCA的排序规则

字符集基地整理
utf8utf8_unicode_ci
ucs2ucs2_unicode_ci
utf16utf16_unicode_ci
utf32utf32_unicode_ci

以下各节说明如何添加一个排序规则使用LDML语法定义,并提供支持MySQL总结LDML规则。

10.13.4.1定义一个UCA整理使用LDML语法

添加一个UCA整理不重新编译MySQL设置一个Unicode字符,请使用以下过程。如果你不熟悉用于描述排序的排序特征LDML规则,看第10.13.4.2,“LDML语法支持MySQL”

该示例将一个整理命名utf8_phone_ciUTF8字符集。整理设计方案涉及的Web应用,用户发布自己的名字和电话号码。电话号码可以在不同的格式:

+7-12345-67
+7-12-345-67
+7 12 345 67
+7 (12) 345 67
+71234567

通过处理这些价值观提出的问题是,不同的许可格式使搜索非常困难的一个特殊的电话号码。解决的办法是定义一个新的排序规则,将标点符号,使他们忽略。

  1. 选择一个排序规则的ID,如图所示第10.13.2,选择“排序规则ID”。以下步骤使用1029个ID。

  2. 修改Index.xml配置文件。这个文件位于目录命名的character_sets_dir系统变量。你可以检查变量的值如下,虽然路径名可能在您的系统上的不同:

    MySQL的&#62;SHOW VARIABLES LIKE 'character_sets_dir';| -------------------- ----------------------------------------- _ name值变| | -------------------- ----------------------------------------- |字符集_ _ | /用户/地方/目录/分享/ MySQL / MySQL / | charsets ----------------------------------------- --------------------
  3. 选择在整理列表名称Index.xml文件此外,您将需要提供的排序规则排序规则。找到<charset>集,整理被添加的特征元素,并添加一个<collation>元素显示排序规则名称和ID,将名字与ID.在<collation>元,提供<rules>包含排序规则元:

    <charset name="utf8">  ...  <collation name="utf8_phone_ci" id="1029">    <rules>      <reset>\u0000</reset>      <i>\u0020</i> <!-- space -->      <i>\u0028</i> <!-- left parenthesis -->      <i>\u0029</i> <!-- right parenthesis -->      <i>\u002B</i> <!-- plus -->      <i>\u002D</i> <!-- hyphen -->    </rules>  </collation>  ...</charset>
  4. 如果你想要其他Unicode字符集的相似的整理、添加等<collation>元素例如,定义ucs2_phone_ci,添加一个<collation>元素的<charset name="ucs2">元素记得每次整理必须有自己独特的ID.

  5. 重新启动服务器,并使用这个语句来验证整理存在:

    mysql> SHOW COLLATION WHERE Collation = 'utf8_phone_ci';
    +---------------+---------+------+---------+----------+---------+
    | Collation     | Charset | Id   | Default | Compiled | Sortlen |
    +---------------+---------+------+---------+----------+---------+
    | utf8_phone_ci | utf8    | 1029 |         |          |       8 |
    +---------------+---------+------+---------+----------+---------+
    

现在测试整理以确保它具有所期望的性能。

创建一个表,使用新的排序规则包含一些示例的电话号码:

mysql> CREATE TABLE phonebook (
         name VARCHAR(64),
         phone VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_phone_ci
       );
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO phonebook VALUES ('Svoj','+7 912 800 80 02');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO phonebook VALUES ('Hf','+7 (912) 800 80 04');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO phonebook VALUES ('Bar','+7-912-800-80-01');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO phonebook VALUES ('Ramil','(7912) 800 80 03');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO phonebook VALUES ('Sanja','+380 (912) 8008005');
Query OK, 1 row affected (0.00 sec)

运行某些查询是否忽略标点符号实际上是比较和排序忽视:

mysql> SELECT * FROM phonebook ORDER BY phone;
+-------+--------------------+
| name  | phone              |
+-------+--------------------+
| Sanja | +380 (912) 8008005 |
| Bar   | +7-912-800-80-01   |
| Svoj  | +7 912 800 80 02   |
| Ramil | (7912) 800 80 03   |
| Hf    | +7 (912) 800 80 04 |
+-------+--------------------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM phonebook WHERE phone='+7(912)800-80-01';
+------+------------------+
| name | phone            |
+------+------------------+
| Bar  | +7-912-800-80-01 |
+------+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM phonebook WHERE phone='79128008001';
+------+------------------+
| name | phone            |
+------+------------------+
| Bar  | +7-912-800-80-01 |
+------+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM phonebook WHERE phone='7 9 1 2 8 0 0 8 0 0 1';
+------+------------------+
| name | phone            |
+------+------------------+
| Bar  | +7-912-800-80-01 |
+------+------------------+
1 row in set (0.00 sec)

10.13.4.2 LDML语法支持MySQL

本节描述LDML语法,MySQL承认。这是语法可在LDML规范中描述的子集www.unicode.org http:/ / / / /报告tr35,应进一步信息咨询。MySQL承认一个足够大的子集的语法,在许多情况下,有可能从Unicode常见的现场数据库下载整理的定义和粘贴相关的部分(即之间的部分<rules></rules>标签)到MySQLIndex.xml文件本规则都支持除了字符排序只发生在初级水平。指定在中等以上水平的差异是公认的排序规则(可包括在整理定义)但作为基层平等。

MySQL服务器生成诊断发现问题解析Index.xml文件看到第10.13.4.3,“index.xml解析”在诊断

字符表示

人物命名可以逐字LDML规则或\unnnn格式,在nnnn是十六进制Unicode代码点价值。例如,á可以写上或“u0041\u00E1。在十六进制值,数字通过F不区分大小写;u00e1 \\u00e1是等价的。UCA 4.0.0排序规则,十六进制记数法只能用于在基本多文种平面的人物,不为外界的BMP字符范围0000FFFF. For UCA 5.2.0 Collation,Hexadecican评级can be used for any character .

这个Index.xml文件本身应该使用gb3212编码。

语法规则

LDML已重置规则和转移规则指定字符的排序。序给出一套规则,一个复位规则建立一个锚点开始,其次是转变规则,说明字符的排序相对于锚点。

  • <reset>规则本身并不指定任何命令。相反,它重置订购后移的规则使他们是在与一个给定的字符。下列规则将随后转移规则是关系到信'A'

    <reset>A</reset><reset>\u0041</reset>
  • 这个<p><s>,和<t>转换规则定义主要的,次要的,而从另一个字符一个字符三差异:

    • 使用主要的差异来区分不同的字母。

    • 使用次要的差异来区分重音的变化。

    • 使用三的差异来区分lettercase变化。

    这些规则是指定一个主要变化规律为'G'人物

    <p>G</p><p>\u0047</p>
  • 这个<i>换档规律表明,一个性质相同的另一个。以下规则的原因“B”排序一样'a'

    <reset>a</reset><i>b</i>
  • 简称移多移规则语法指定使用一对标签。下表显示缩写语法规则和等效的对应关系nonabbreviated规则。

    表10.5略移语法

    简略语法nonabbreviated语法
    <pc>xyz</pc><p>x</p><p>y</p><p>z</p>
    <sc>xyz</sc><s>x</s><s>y</s><s>z</s>
    <tc>xyz</tc><t>x</t><t>y</t><t>z</t>
    <ic>xyz</ic><i>x</i><i>y</i><i>z</i>

  • 一个扩展是一个重置规则,建立一个多字符序列的一个定位点。MySQL支持扩展2到6个字符长。以下的规则'z'大基层比三个字符的序列“ABC”

    <reset>abc</reset>
    <p>z</p>
    
  • 收缩是一个转移规则排序的多个字符序列。MySQL支持收缩2到6个字符长。下面的规则将三个字符的序列'xyz'大基层比&#39; &#39;

    <reset>a</reset>
    <p>xyz</p>
    
  • 长期扩张和收缩可以一起使用。这些规则将三个字符的序列'xyz'大基层比三个字符的序列“ABC”

    <reset>abc</reset>
    <p>xyz</p>
    
  • 正常的扩展语法使用<x><extend>元素指定一个扩展。下面的规则将字符'k'大二级比序列“ch”。这是,'k'作为如果它扩展为一个字符后“C”然后'h'

    <reset>c</reset><x><s>k</s><extend>h</extend></x>

    这个语法允许长序列。这些规则排序的序列'ccs'在三级比序列“肿瘤干细胞”

    <reset>cs</reset>
    <x><t>ccs</t><extend>cs</extend></x>
    

    该规范描述了正常的扩展语法LDML狡猾的看到规范细节

  • 以前的上下文语法使用<x><context>元素指定上下文在角色如何影响它的各种。以下的规则'-'大二级比&#39; &#39;,但只有当'-'发生后“B”

    <reset>a</reset>
    <x><context>b</context><s>-</s></x>
    
  • 以前的上下文的语法可以包括<extend>元素这些规则将“def”大基层比'aghi',但只有当“def”之后'abc'

    <reset>a</reset><x><context>abc</context><p>def</p><extend>ghi</extend></x>
  • 复位的规则允许before属性。通常情况下,转换规则重置规则后显示字符排序复位后的特性。改变规则后重置规则,有之前属性显示字符的排序复位前字符。下面的规则将字符'b'之前&#39; &#39;在初级水平:

    <reset before="primary">a</reset>
    <p>b</p>
    

    允许before属性值指定排序的级别名称或等效数值:

    <reset before="primary"><reset before="1"><reset before="secondary"><reset before="2"><reset before="tertiary"><reset before="3">
  • 重置规则可以命名一个逻辑复位位置而不是文字字符:

    <first_tertiary_ignorable/>
    <last_tertiary_ignorable/>
    <first_secondary_ignorable/>
    <last_secondary_ignorable/>
    <first_primary_ignorable/>
    <last_primary_ignorable/>
    <first_variable/>
    <last_variable/>
    <first_non_ignorable/>
    <last_non_ignorable/>
    <first_trailing/>
    <last_trailing/>
    

    这些规则将'z'在初级的水平比有一个默认的Unicode排序元素表不可忽略字符大(DUCET出入不是CJK):

    <reset><last_non_ignorable/></reset><p>z</p>

    逻辑位置的编码点如下表所示。

    表10.6逻辑复位位置编码点

    逻辑位置Unicode代码点的4.0.05.2.0 Unicode代码点
    <first_non_ignorable/>在02d0在02d0
    <last_non_ignorable/>你a48cU 1342e
    <first_primary_ignorable/>在0332在0332
    <last_primary_ignorable/>你20ea你101fd
    <first_secondary_ignorable/>在0000在0000
    <last_secondary_ignorable/>U fe73U fe73
    <first_tertiary_ignorable/>在0000在0000
    <last_tertiary_ignorable/>U fe73U fe73
    <first_trailing/>在0000在0000
    <last_trailing/>在0000在0000
    <first_variable/>U 0.009U 0.009
    <last_variable/>2183 UU 1d371

  • 这个<collation>元素允许后移法属性影响特征权重计算转移规则。具有这些属性的允许值:

    • simple性格:计算权重重置规则,没有之前属性。这是默认的如果没有给出属性。

    • expand:复位后使用扩展规则变化。

    假设'0'“1”有权0E290e2a我们要把所有基本拉丁字母之间'0'“1”

    <reset>0</reset>
    <pc>abcdefghijklmnopqrstuvwxyz</pc>
    

    对于简单的换档模式,权重计算如下:

    'a' has weight 0E29+1
    'b' has weight 0E29+2
    'c' has weight 0E29+3
    ...
    

    然而,没有足够的空位置放26个字符之间'0'“1”。结果是,数字和字母混合。

    为了解决这个问题,使用shift-after-method="expand"。那么这样的权重计算:

    一个有重量0e29 ] [ 1 ] [ 233d B具有重量0e29 ] [ 2 ] [ 233d C具有重量0e29 ] [ 3 ] [ 233d…

    233D是台湾4.0.0重量特性0xa48c这是最后一个不可忽略的角色,(一种在整理,最大的特点不包括中日韩)。UCA 5.2.0相似但使用3ACA,字符0x1342e

特异性LDML Ex电压Ex电压

对规则的扩展允许LDML<collation>元素包含一个可选的版本属性<collation>标签表明台湾版上整理的基础。如果版本属性被忽略,其默认值是4.0.0。例如,本规范说明整理是基于UCA 5.2.0:

<collation id="nnn" name="utf8_xxx_ci" version="5.2.0">...</collation>

在10.13.4.3诊断index.xml解析

MySQL服务器生成诊断发现问题解析Index.xml文件:

  • 未知的标签写入错误日志。例如,下面的消息结果如果排序规则定义中包含<aaa>标签

    [ Warning ] Buffered Warning:unknown LDML tag : &#39; Charsets / Charse / Collation / Rules / AAA &#39;
  • 如果整理的初始化是不可能的,服务器报告未知的整理错误,并产生警告说明的问题,如在前面的例子。在其他情况下,当一个整理描述通常是正确的但包含一些未知的标签,整理的初始化和使用。未知的部分被忽略,但警告是在错误日志中生成。

  • 问题的排序规则生成警告,客户端可以显示SHOW WARNINGS。假设一个重置规则包含一个扩展的时间比所支持的最大长度为6个字符:

    <reset>abcdefghi</reset><i>x</i>

    企图利用整理产生的警告:

    mysql> SELECT _utf8'test' COLLATE utf8_test_ci;
    ERROR 1273 (HY000): Unknown collation: 'utf8_test_ci'
    mysql> SHOW WARNINGS;
    +---------+------+----------------------------------------+
    | Level   | Code | Message                                |
    +---------+------+----------------------------------------+
    | Error   | 1273 | Unknown collation: 'utf8_test_ci'      |
    | Warning | 1273 | Expansion is too long at 'abcdefghi=x' |
    +---------+------+----------------------------------------+
    

10.14字符集配置

你可以用改变默认的服务器字符集和整理--character-set-server--collation-server当你启动服务器选项。整理必须是一个合法的整理为默认字符集。(使用SHOW COLLATION声明确定的排序规则可为每个字符集)看到。第5.1.6、“服务器选项”

如果你想用一个字符集,不编译成二进制文件,你可能会遇到以下问题:

  • 你的程序使用了不正确的路径以确定该字符集存储(通常是share/mysql/charsets分享/字符集MySQL安装目录下的目录)。这可以固定使用--character-sets-dir选择当你运行程序中的问题。例如,指定一个目录是由MySQL客户端程序使用,列入[客户]您选择的文件组。这里给出的例子说明怎样设置可能看起来像Unix或Windows,分别:

    [client]
    character-sets-dir=/usr/local/mysql/share/mysql/charsets
    
    [client]
    character-sets-dir="C:/Program Files/MySQL/MySQL Server 8.0/share/charsets"
    
  • 字符集是一个复杂的字符集,不能动态加载。在这种情况下,你必须重新编译与支持的字符集的程序。

    Unicode字符集,你可以定义排序规则,而无需重新编译使用LDML符号。看到第10.13.4,”添加一个UCA整理Unicode字符集”

  • 字符集是一个动态的字符集,但你没有一个配置文件,它。在这种情况下,你应该安装建立一个新的MySQL分布特征的配置文件。

  • 如果你的字符集的索引文件不包含的字符集的名称,您的程序将显示一个错误消息。文件命名为Index.xml该消息:

    字符集”charset_name“不是一个编译字符集和没有指定在“/ usr /分享/ MySQL /字符集/索引XML文件。

    为了解决这个问题,你可以得到一个新的索引文件或手动添加缺少的任何字符集到当前文件的名称。

你可以强制客户端程序使用特定的字符设置如下:

[client]
default-character-set=charset_name

这通常是不必要的。然而,当character_set_system不同于character_set_servercharacter_set_client你输入的字符,和手动(数据库对象标识符,列的值,或两者都有),这可能显示不正确的输出从客户端或输出本身的格式可能不正确。在这样的情况下,启动MySQL客户端--default-character-set=system_character_set即设置相匹配的系统字符集的客户特征应该可以解决这个问题。

MyISAM表,你可以检查字符集名称和数量表DVB - myisamchktbl_name

10.15本地MySQL服务器支持

The local indicated by thelc_time_names系统变量控制语言用于显示日期和月份的名称和缩写。这个变量的影响输出DATE_FORMAT()DAYNAME(),和MONTHNAME()功能.

lc_time_names不影响STR_TO_DATE()GET_FORMAT()功能

这个lc_time_names值不影响结果FORMAT(),但这个函数接受一个可选的三参数使现场被指定用于结果数的小数点,千位分隔符和分组之间的分隔符。允许设置值为法律价值观相同lc_time_names系统变量

区域名称的语言和区域子标记被IANA(http://www.iana.org/assignments/language-subtag-registry)等'ja_JP'“PT”_ BR。默认值是'en_US'无论你的系统区域设置,但是你可以设置的值在服务器启动或设置全球如果你的价值SYSTEM_VARIABLES_ADMINSUPER特权。任何客户可以检查的价值lc_time_names或其会话影响到现场为自己的连接价值。

mysql> SET NAMES 'utf8';
Query OK, 0 rows affected (0.09 sec)

mysql> SELECT @@lc_time_names;
+-----------------+
| @@lc_time_names |
+-----------------+
| en_US           |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT DAYNAME('2010-01-01'), MONTHNAME('2010-01-01');
+-----------------------+-------------------------+
| DAYNAME('2010-01-01') | MONTHNAME('2010-01-01') |
+-----------------------+-------------------------+
| Friday                | January                 |
+-----------------------+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT DATE_FORMAT('2010-01-01','%W %a %M %b');
+-----------------------------------------+
| DATE_FORMAT('2010-01-01','%W %a %M %b') |
+-----------------------------------------+
| Friday Fri January Jan                  |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> SET lc_time_names = 'es_MX';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@lc_time_names;
+-----------------+
| @@lc_time_names |
+-----------------+
| es_MX           |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT DAYNAME('2010-01-01'), MONTHNAME('2010-01-01');
+-----------------------+-------------------------+
| DAYNAME('2010-01-01') | MONTHNAME('2010-01-01') |
+-----------------------+-------------------------+
| viernes               | enero                   |
+-----------------------+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT DATE_FORMAT('2010-01-01','%W %a %M %b');
+-----------------------------------------+
| DATE_FORMAT('2010-01-01','%W %a %M %b') |
+-----------------------------------------+
| viernes vie enero ene                   |
+-----------------------------------------+
1 row in set (0.00 sec)

日或月为每个受影响的函数名称转换utf8该字符集表示的character_set_connection系统变量

lc_time_names可以设置为以下任何区域设置值。支持MySQL的地点设置可能不同于您的操作系统支持。

区域价值意义
ar_AE:阿拉伯语-阿拉伯联合酋长国ar_BH:阿拉伯语-巴林
ar_DZ:阿拉伯语-阿尔及利亚ar_EG:阿拉伯语-埃及
ar_IN:阿拉伯语-印度ar_IQ:阿拉伯语-伊拉克
ar_JO乔丹:arabicar_KW:阿拉伯语-科威特
ar_LB:阿拉伯语-黎巴嫩ar_LY:阿拉伯语-利比亚
ar_MA:阿拉伯语-摩洛哥ar_OM:阿拉伯语-阿曼
ar_QA:阿拉伯语-卡塔尔ar_SA:阿拉伯语-沙特阿拉伯
ar_SD:阿拉伯语-苏丹ar_SY:阿拉伯语-叙利亚
ar_TN:阿拉伯语-突尼斯ar_YE:阿拉伯语-也门
be_BY:白俄罗斯-白俄罗斯bg_BG:保加利亚-保加利亚
ca_ES西班牙:加泰罗尼亚cs_CZ:捷克-捷克共和国
da_DK:丹麦-丹麦de_AT:德国-奥地利
de_BE:德国-比利时de_CH:德国-瑞士
de_DE:德国-德国de_LU:德国-卢森堡
el_GR:希腊-希腊en_AU澳大利亚:英语
en_CA加拿大:英语en_GB英国:英语
en_IN印度:英语en_NZ新西兰:英语
en_PH菲律宾:英语en_US:英语-美国
en_ZA南非:英语en_ZW津巴布韦:英语
es_AR:西班牙-阿根廷es_BO玻利维亚:西班牙
es_CL西班牙智利es_CO哥伦比亚:西班牙
es_CR哥斯达黎加:西班牙es_DO:西班牙-多米尼加共和国
es_EC厄瓜多尔:SDHes_ES:西班牙-西班牙
es_GT西班牙:危地马拉es_HN洪都拉斯:英语
es_MX西班牙-墨西哥:es_NI西班牙:-尼加拉瓜
es_PA西班牙:巴拿马es_PE:秘鲁-西班牙
es_PR西班牙波多黎各es_PY巴拉圭:西班牙
es_SVSpanish:Spanish - el Salvadores_US:西班牙-美国
es_UY西班牙:乌拉圭es_VE:西班牙-委内瑞拉
et_EE爱沙尼亚:爱沙尼亚eu_ESBashk-Bashque
fi_FI芬兰:芬兰fo_FO:faroese -法罗群岛
fr_BE:法国-比利时fr_CA:法国-加拿大
fr_CH:法国-瑞士fr_FR法国-法国
fr_LU:法国-卢森堡gl_ES:加利西亚-西班牙
gu_IN印度:古吉拉特语he_IL:希伯来-以色列
hi_IN:印度-印度hr_HR:克罗地亚-克罗地亚
hu_HU匈牙利:匈牙利--id_ID:印尼-印度尼西亚
is_IS:一个是冰岛的it_CH瑞士:意大利
it_IT意大利:意大利ja_JP:日本日本
ko_KR:韩国-大韩民国lt_LT立陶宛:立陶宛
lv_LV拉脱维亚:拉脱维亚mk_MK马其顿:马其顿语
mn_MN:蒙古-蒙古ms_MYMalay-Malaysia
nb_NO挪威:挪威(挪威)nl_BE:荷兰-比利时
nl_NL荷兰:荷兰no_NO挪威:挪威
pl_PL波兰:波兰pt_BR:portugese -巴西
pt_PT葡萄牙葡萄牙:rm_CH罗曼语:-瑞士
ro_RO:罗马尼亚罗马尼亚ru_RU俄罗斯:俄罗斯
ru_UA:俄罗斯-乌克兰sk_SK斯洛伐克共和国:斯洛伐克
sl_SI斯洛文尼亚:斯洛文尼亚sq_AL阿尔巴尼亚:阿尔巴尼亚
sr_RS南斯拉夫塞尔维亚的:sv_FI:瑞典-芬兰
sv_SE:瑞典-瑞典ta_IN:泰米尔-印度
te_IN印度泰卢固语:th_TH泰国:泰国
tr_TR土耳其:土耳其uk_UA乌克兰:乌克兰
ur_PK:乌尔都语-巴基斯坦vi_VN:越南- Viet Nam
zh_CN中国-中国zh_HK中文:香港
zh_TW:中国-中国台湾省