MySQL中的UTF-8:精确的字符串比较和无外壳全文搜索都可能吗?

时间:2012-03-03 13:52:23

标签: mysql utf-8 full-text-search

通过研究和测试,我发现如果对字段使用utf8_bin编码(保证准确的字符串比较)并将整理转换为例如,那么拉丁字符集的行为似乎最为平等。 utf8_general_ci在“order by”子句中。

但是,我找不到一个解决方法来进行无壳全文搜索工作,因为既没有整理转换,也没有人可以在全文关键字上使用“lower”。

考虑到我到目前为止所读到的关于这个主题的内容,这可能就像吃蛋糕一样吃了但是我想在回到拉丁字符集之前我会问,并从我的网站上获取国际支持。< / p>

2 个答案:

答案 0 :(得分:0)

MySQL支持完整的“perl-style”正则表达式,因此您应该能够在搜索词中指定大小写独立性:WHERE field RLIKE '(?i)search term'。不能肯定地说,但它应该与utf-8一起工作。

编辑:(?i)及其亲属未在MySQL页面中提及,因此这可能不是首发。

答案 1 :(得分:0)

我现在根据亚历克西斯关于正则表达式的提示测试了许多变体,为了处理这个问题的其他人,我想我应该分享我的发现。

在我的视图中预先提供最佳解决方案:在二进制utf-8字段上使用lower()以及查找整个关键字的正则表达式。
至少就一个表的解决方案而言。我想最后,我对原始问题的回答是有两张桌子。包含小写格式的所有文本并用于全文搜索的文本,以及包含显示给用户的文本的文本。数据量的两倍,但使用布尔搜索的查询将花费更少的时间来完成。

首先,以全文索引作为参考点的非二进制表:

SELECT * FROM texts WHERE MATCH (text1, text2, text3, text4) AGAINST ('psycho' in boolean mode) 
Query took 0.0003 sec

二进制最快的解决方案:

SELECT * FROM texts_bin WHERE lower(text1) rlike 'psycho' OR lower(text2) rlike 'psycho' OR lower(text3) rlike 'psycho' OR lower(text4) rlike 'psycho'
Query took 0.0014 sec

另外 - 我进行的其他测试可能会有所帮助:

SELECT * FROM texts_bin WHERE lower(text1) like '%psycho%' OR lower(text2) like '%psycho%' OR lower(text3) like '%psycho%' OR lower(text4) like '%psycho%'
Query took 0.0023 sec

SELECT * FROM texts_bin WHERE text1 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)' OR text2 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)' OR text3 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)' OR text4 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)'
Query took 0.0282 sec