mysql重音不敏感和点缀不敏感的搜索

时间:2011-10-09 21:32:05

标签: php mysql search

问题:我正在尝试实现一种搜索算法,即使提供了虚线字符也会显示结果。换句话说:SELECT 'über' = 'uber'SELECT 'mas' = 'maş'这些结果将返回true。这将适用于以下数组中的每个char:

$arr = array('ş' => 's', 'ç' => 'c', 'ö' => 'o', 'ü' => 'u' and so on ...);

我心中的解决方案:与原始列一起,我可以拥有一个存储英文名称的特定列。因此,在将'über'存储到数据库之前,我还会将其转换为php中的'uber',然后将'über'(作为原始)和'uber'(作为可搜索的)存储到数据库中。

但是,即使我一整天都在搜索这个内容,我仍然认为应该有一种更简单,更清晰的方法来完成任务,因为这意味着(或多或少)将相同的数据存储两次数据库。那么伙计们,您认为解决方案是唯一可行的方法,或者您知道更好的方法吗?

修改

对于口音不敏感我已经看过SO上的帖子,他们正在工作,但由于我也在考虑点缀字符,我不得不问这个问题。

EDIT2

由于某些原因,我无法准确发布整个表结构和代码,但我将提供一个接近的示例。

myusers | CREATE TABLE `myusers` (
id int auto_increment not null primary key,
email varchar(100) COLLATE latin1_general_ci not null,
fullname varchar(75) COLLATE latin1_general_ci not null)
PRIMARY KEY('id')
) ENGINE=MyISAM AUTO_INCREMENET=2 DEFAULT CHARSET=latin1 COLLATE latin1_general_ci |

以上是表格的结构。这里插入并选择:

INSERT INTO myusers (fullname) VALUES ('Agüeda');
INSERT INTO myusers (fullname) VALUES ('Agueda');

SELECT * FROM myusers WHERE fullname = 'Agüeda' COLLATE latin1_general_ci 

+----+-------+----------+
| id | email | fullname |
+----+-------+----------+
|  1 |       | Agüeda   |
+----+-------+----------+
1 row in set (0.00 sec)

SELECT * FROM myusers WHERE fullname = 'agueda' COLLATE latin1_general_ci 

+----+-------+----------+
| id | email | fullname |
+----+-------+----------+
|  2 |       | Agueda   |
+----+-------+----------+
1 row in set (0.00 sec)

嗯,理想的结果显然是当搜索agueda时,'Agueda'和'Agüeda'都将返回,但事实并非如此。正如我上面提到的,我创建了一个新列,并用英文字符存储整个名称,并从那里进行搜索。但仍然,它花了我两倍的搜索(因为我也搜索在搜索结果中排名更高的原始列)。应该有更好的方式...

4 个答案:

答案 0 :(得分:2)

只需使用适当的排序规则。例如:

create table test(
    foo text
) collate = utf8_unicode_ci;
insert into test values('Agüeda');
insert into test values('Agueda');
select * from test where foo = 'Agueda';

这会给你两行。

答案 1 :(得分:1)

1)编写自己的排序规则。 latin1_general_diacriticinsensitive。我甚至不知道从哪里开始,但是:)。

2)使用正则表达式和字符组:/ [uü] ber /

3)你心中的解决方案。我个人使用它,因为设计完全是妥协,这是一个简单的解决方案,只需100%的空间开销。当然,空间开销可能最终会变成速度开销,尤其是对MySQL而言,但是后来需要担心。如果需要,这也很容易撤消。

答案 2 :(得分:0)

好吧,我没有尝试更换它们并运行搜索x次,而是建议使用mysql函数“LIKE”即“SELECT * FROM x WHERE搜索LIKE'%ber'。你需要更换的地方带有“%”的变音符号。

编辑:我的错误“%”替换了任意数量的字符。使用“_”表示单个字符。

答案 3 :(得分:0)

看一下这篇文章:https://stackoverflow.com/questions/500826

他正面临着与之相反的问题。查看所选答案中的WHERE子句。可能你只能使用_ci后缀,它会起作用。

告诉我们如何解决这个问题。