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

Sha*_*kan 6 php mysql search

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

$arr = array('?' => 's', 'ç' => 'c', 'ö' => 'o', 'ü' => 'u' and so on ...);
Run Code Online (Sandbox Code Playgroud)

我心中的解决方案:与原始专栏一起,我可以有一个特定的列来存储英文名称.因此,在将'ü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 |
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

aib*_*aib 2

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

\n\n

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

\n\n

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

\n