Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Adding a User-Defined Collation for Full-Text Indexing

14.9.7 为全文索引添加用户定义的排序规则

Warning

用户定义的排序规则已弃用;您应该期望在未来版本的 MySQL 中删除对它们的支持。服务器将为任何使用 COLLATE user_defined_collation 的 SQL 语句发出警告;当服务器以 --collation-server 设置为用户定义的排序规则名称时,也会发出警告。

本节描述如何使用内置的全文解析器为全文搜索添加用户定义的排序规则。示例排序规则类似于 latin1_swedish_ci,但将 '-' 字符视为字母而不是标点符号,以便将其作为单词字符索引。关于添加排序规则的一般信息,请参阅 第 12.14 节,“为字符集添加排序规则”;假设您已经阅读了该节并熟悉相关文件。

要添加全文索引的排序规则,请按照以下步骤进行。以下说明将添加一个简单字符集的排序规则,该字符集可以使用描述字符集属性的配置文件创建,如 第 12.14 节,“为字符集添加排序规则” 所讨论的那样。对于 Unicode 等复杂字符集,请使用描述字符集属性的 C 源文件创建排序规则。

  1. 将排序规则添加到 Index.xml 文件中。用户定义的排序规则的允许 ID 范围在 第 12.14.2 节,“选择排序规则 ID” 中给出。ID 必须未使用,因此请选择与 1025 不同的值,如果该 ID 已经在您的系统上被占用。

    <charset name="latin1">
    ...
    <collation name="latin1_fulltext_ci" id="1025"/>
    </charset>
  2. latin1.xml 文件中声明排序规则的排序顺序。在这种情况下,可以从 latin1_swedish_ci 复制顺序。

    <collation name="latin1_fulltext_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 5C 5B 5C 43 45 45 45 45 49 49 49 49
    44 4E 4F 4F 4F 4F 5D D7 D8 55 55 55 59 59 DE DF
    41 41 41 41 5C 5B 5C 43 45 45 45 45 49 49 49 49
    44 4E 4F 4F 4F 4F 5D F7 D8 55 55 55 59 59 DE FF
    </map>
    </collation>
  3. 修改 latin1.xml 文件中的 ctype 数组。在该数组中,将对应于 0x2D(即 '-' 字符的代码)的值从 10(标点)更改为 01(大写字母)。在以下数组中,这是第四行下第三个值从右侧开始。

    <ctype>
    <map>
    00
    20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20
    20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
    48 10 10 10 10 10 10 10 10 10 10 10 10 01 10 10
    84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10
    10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01
    01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10
    10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02
    02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20
    10 00 10 02 10 10 10 10 10 10 01 10 01 00 01 00
    00 10 10 10 10 10 10 10 10 10 02 10 02 00 02 01
    48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
    10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
    01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
    01 01 01 01 01 01 01 10 01 01 01 01 01 01 01 02
    02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
    02 02 02 02 02 02 02 10 02 02 02 02 02 02 02 02
    </map>
    </ctype>
  4. 重新启动服务器。

  5. 要使用新排序规则,请在要使用它的列的定义中包括它:

    mysql> DROP TABLE IF EXISTS t1;
    Query OK, 0 rows affected (0.13 sec)
    
    mysql> CREATE TABLE t1 (
        a TEXT CHARACTER SET latin1 COLLATE latin1_fulltext_ci,
        FULLTEXT INDEX(a)
        ) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.47 sec)
  6. 测试排序规则以验证连字符是否被视为单词字符:

    mysql> INSERT INTO t1 VALUEs ('----'),('....'),('abcd');
    Query OK, 3 rows affected (0.22 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM t1 WHERE MATCH a AGAINST ('----' IN BOOLEAN MODE);
    +------+
    | a    |
    +------+
    | ---- |
    +------+
    1 row in set (0.00 sec)