我创建了一个与数据库中的名称列表匹配的自动完成功能。
我正在使用的数据库包含大量带有特殊字符的名称,但最终用户最有可能使用与这些名称相同的英语进行搜索,例如: Bela Bartok
的{{1}}和Béla Bartók
的{{1}}等。目前,执行英语搜索不会返回任何结果。
我遇到过线程,说解决这个问题的方法是将你的MySQL排序规则改为utf8(我已经做过无用)。
我认为这可能是因为我使用了Dvorak
,但获得我想要的结果的是Dvořák
。后者的问题是所有评论都说不再使用它。
有谁知道如何解决这个问题?
答案 0 :(得分:0)
如果您知道特殊字符列表以及普通英语中的等价物,那么您可以执行以下操作:
您需要使用MySQL的全文搜索来搜索文本或提出一个本土解决方案,以便您处理该问题。
答案 1 :(得分:0)
刚刚使用utf8_general_ci
和utf8_unicode_ci
排序规则进行了测试,在两种情况下它都像魅力一样。
按照我用来运行测试的MySQL代码:
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`text` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `test` (`id`, `text`) VALUES (NULL, 'Dvořák'), (NULL, 'Béla Bartók');
SELECT * FROM `test` WHERE `text` LIKE '%dvorak%';
上面的SELECT
语句返回:
id text
--------------
1 Dvořák
注意:在测试期间,我将所有排序规则设置为所需的排序规则。数据库排序规则,表排序规则和列排序规则。
您的PHP应用程序中是否存在错误?
答案 2 :(得分:0)
我找到了解决问题的方法。将排序规则更改为utf8_unicode_ci
非常正常。我的问题是我需要在我的查询中使用REGEXP
而不是LIKE
,但REGEXP
显然在这种情况下不起作用!
因此,简而言之,将排序规则更改为utf8_unicode_ci
将允许您使用=
或LIKE
来比较Dvorak和Dvořák,但不能使用REGEXP等效项之一。
答案 3 :(得分:0)
首先,让我们看看数据是否正确存储。做
SELECT name, HEX(name) FROM ... WHERE ...;
Béla
可能会出来(忽略空格)
42 C3A9 6C 61 -- if correctly encoded with utf8 (é = C3A9)
42 E9 6C 61 -- if encoded with latin1 (é = E9)
“排序规则”(utf8_general_ci或utf8_unicode_ci)对您提供的示例没有任何影响。两者都是é = e
。请参阅extensive list of equivalences for utf8 collations。
确定编码后,我们可以继续处方治疗。
答案 4 :(得分:0)
从Rick James那里得到一些暗示,使用:
SELECT * FROM `test` WHERE HEX(`column`) = HEX('Dvořák');
应该有效。如果您需要不区分大小写的查询,那么除了HEX检查之外,您还需要降低/升高双方。
答案 5 :(得分:0)
最新的排序规则是utf8mb4_unicode_520_ci。
注意,它不适用于utf8mb4_unicode_ci。在此处查看比较结果:https://stackoverflow.com/a/59805600/857113