MySQL字符串与特殊字符的比较

时间:2015-08-13 12:15:46

标签: mysql special-characters collation

我创建了一个与数据库中的名称列表匹配的自动完成功能。

我正在使用的数据库包含大量带有特殊字符的名称,但最终用户最有可能使用与这些名称相同的英语进行搜索,例如: Bela Bartok的{​​{1}}和Béla Bartók的{​​{1}}等。目前,执行英语搜索不会返回任何结果。

我遇到过线程,说解决这个问题的方法是将你的MySQL排序规则改为utf8(我已经做过无用)。

我认为这可能是因为我使用了Dvorak,但获得我想要的结果的是Dvořák。后者的问题是所有评论都说不再使用它。

有谁知道如何解决这个问题?

6 个答案:

答案 0 :(得分:0)

如果您知道特殊字符列表以及普通英语中的等价物,那么您可以执行以下操作:

  1. 小写字符串
  2. 使用小写等效项替换字符
  3. 搜索"普通英语"柱
  4. 您需要使用MySQL的全文搜索来搜索文本或提出一个本土解决方案,以便您处理该问题。

答案 1 :(得分:0)

刚刚使用utf8_general_ciutf8_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