MySQL - 在全文搜索中转义&符号(&)

Rob*_*est 16 mysql full-text-search escaping

我们正在使用全文搜索来搜索公司的名称,一切顺利,直到我们的公司名称为&符号为"M&S".

SELECT name FROM company WHERE MATCH (name) against ('M&S' IN BOOLEAN MODE);
Run Code Online (Sandbox Code Playgroud)

由于MySQL将&符号视为布尔运算符,因此无法返回任何结果.需要布尔模式,因此不能简单地关闭它.

我正在寻找的是一种逃避&符号的方法,以便MySQL正确处理它并找到记录.

抛弃全文搜索以支持LIKEs也不是一个选择

谢谢你的帮助

low*_*nts 5

&在您用于全文搜索的排序规则中,似乎不会将其视为单词字符.

所以你必须创建你自己的排序规则(或重新编译你的MySQL服务器),你添加&到我在MySQL文档中找到的单词字符列表( http://dev.mysql.com/doc/refman/5.0/en /fulltext-fine-tuning.html):

如果要更改被视为单词字符的字符集,可以通过多种方式执行此操作,如以下列表中所述.进行修改后,必须为包含任何FULLTEXT索引的每个表重建索引.假设您要将连字符(' - ')视为单词字符.使用以下方法之一:

修改MySQL源:在myisam/ftdefs.h中,查看true_word_char()和misc_word_char()宏.将' - '添加到其中一个宏中并重新编译MySQL.

修改字符集文件:这不需要重新编译.true_word_char()宏使用"字符类型"表来区分字母和数字与其他字符..您可以在其中一个字符集XML文件中编辑数组的内容,以指定' - '是"字母".然后使用给定的FULLTEXT索引字符集.有关数组格式的信息,请参见第10.3.1节"字符定义数组".

为索引列使用的字符集添加新的排序规则,并更改列以使用该排序规则.有关添加排序规则的一般信息,请参见第10.4节"将排序规则添加到字符集".有关特定于全文索引的示例,请参见第12.9.7节"为全文索引添加归类".

更新:如果您使用的是latin1排序规则,请打开位于的XML文件mysql/share/charsets/latin1.xml.并在地图中找到相应的字符代码 - 在这种情况下,您可以将地图用于小写或大写,因为这与&符号无关:

<lower>
<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 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F
 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
 70 71 72 73 74 75 76 77 78 79 7A 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
 E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
 F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF
 E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
</map>
</lower>
Run Code Online (Sandbox Code Playgroud)

&符号的unicode是U+0026和utf-8编码的0x26,所以26在地图中搜索- 这是在第3行,第7列.

然后在ctype-map中将字符的类型从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 01 10 10 10 10 10 10 10 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>
Run Code Online (Sandbox Code Playgroud)

重新启动你的MySQL服务器,相应的排序规则处理&就像一个小写字母.

当然最好先复制并重命名新的collat​​ion XML-file,并复制并粘贴相应的行Index.xml (不要忘记在XML那里使用标签中新的未使用的id )并将它们链接到新的collat​​ion XML-file所以你不会失去原来的整理.

你可以在这里找到我从这里获得大部分信息的完整文档:http: //dev.mysql.com/doc/refman/5.0/en/full-text-adding-collat​​ion.html

注 - 对于使用Mysql 5.7版本的所有人,请使用未使用的归类ID.mysql文章http://dev.mysql.com/doc/refman/5.0/en/fulltext-fine-tuning.html适用于Mysql 5.5版本.要获得最大的排序规则,请使用以下查询 -

   SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;
Run Code Online (Sandbox Code Playgroud)

  • 绝对有效!你能想到这可能导致的任何反响或并发症吗? (2认同)