MySQL 8.4 Release Notes
14.9.7 添加用户自定义全文索引排序规则
Warning
用户自定义排序规则已弃用,您应该预期在未来 MySQL 版本中将其删除。服务器在执行任何使用 COLLATE
语句时发出警告;同样,服务器启动时如果设置了user_defined_collation
--collation-server
等于用户自定义排序规则的名称,也会发出警告。
本节描述如何使用内置全文解析器添加用户自定义排序规则。示例排序规则类似 latin1_swedish_ci
,但将 '-'
字符视为字母,而不是标点字符,以便将其索引为单词字符。关于添加排序规则的总体信息见第12.14节,“添加排序规则到字符集”;假设您已经阅读了该部分内容并熟悉相关文件。
要添加全文索引排序规则,使用以下过程。这里的说明添加简单字符集的排序规则,如第12.14节,“添加排序规则到字符集”所讨论的,可以使用描述字符集属性的配置文件创建排序规则。对于复杂字符集,如 Unicode,使用 C 源文件描述字符集属性创建排序规则。
-
将排序规则添加到
Index.xml
文件中。用户自定义排序的ID范围在第12.14.2节,“选择排序ID”中指定。该ID必须是未使用的,选择一个与系统上已经占用的1025不同值。<charset name="latin1"> ... <collation name="latin1_fulltext_ci" id="1025"/> </charset>
-
在
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>
-
修改
ctype
数组在latin1.xml
中。将 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>
-
重启服务器。
-
要使用新的排序规则,包括它在将其使用的列定义中:
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)
-
测试排序规则以验证连字符被认为是单词字符:
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)