Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中的UTF-8:可以进行精确的字符串比较和无大小写全文搜索吗?_Mysql_Utf 8_Full Text Search - Fatal编程技术网

MySQL中的UTF-8:可以进行精确的字符串比较和无大小写全文搜索吗?

MySQL中的UTF-8:可以进行精确的字符串比较和无大小写全文搜索吗?,mysql,utf-8,full-text-search,Mysql,Utf 8,Full Text Search,通过研究和测试,我发现,如果对字段使用utf8_-bin编码,可以保证精确的字符串比较,并将排序规则转换为例如utf8_-general_-ci(按顺序子句),则拉丁字符集的行为似乎最为平等 然而,我找不到一个解决办法来让无大小写全文搜索工作,因为既没有排序规则转换,也没有人可以使用全文键上的lower 考虑到目前为止我所读到的关于整个主题的内容,这可能就像吃蛋糕一样,但我想在我回到拉丁字符集并从我的网站上删除国际支持之前,我应该先问一下。MySQL支持完全perl风格的正则表达式,因此,您应该

通过研究和测试,我发现,如果对字段使用utf8_-bin编码,可以保证精确的字符串比较,并将排序规则转换为例如utf8_-general_-ci(按顺序子句),则拉丁字符集的行为似乎最为平等

然而,我找不到一个解决办法来让无大小写全文搜索工作,因为既没有排序规则转换,也没有人可以使用全文键上的lower


考虑到目前为止我所读到的关于整个主题的内容,这可能就像吃蛋糕一样,但我想在我回到拉丁字符集并从我的网站上删除国际支持之前,我应该先问一下。

MySQL支持完全perl风格的正则表达式,因此,您应该能够在搜索项中指定大小写独立性:WHERE字段类似于“?isearch term”。不能肯定,但它应该与utf-8一起工作


编辑:?MySQL页面中没有提到我和它的亲属,所以这可能是一个非初学者

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

在我看来,最好的解决方案是:在二进制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

嗯,我想我可以为搜索词中的每个字符寻找大写字母|小写字母。我只是担心包含数千个单词的文本的搜索速度。如果不需要很多回溯,正则表达式搜索在计算上是高效的,而单字母搜索则不需要,因此它们应该比任何需要遵循很多复杂规则的排序快。我想试试看。