繁体   English   中英

mysql 重音不敏感和虚线不敏感搜索

[英]mysql accent insensitive and dotted insensitive search

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

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

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

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

编辑

对于口音不敏感,我已经看到了 SO 上的帖子,它们正在工作,但由于我也在考虑虚线字符,我不得不问这个问题。

编辑2

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

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' 都会返回,但事实并非如此。 正如我上面提到的,我创建了一个新列并以英文字符存储全名,并从那里进行搜索。 但是,它仍然花费了我两次搜索(因为我也在搜索在搜索结果中排名更高的原始列)。 应该有更好的方法...

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

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) 编写您自己的校对规则。 latin1_general_diacriticinsensitive。 不过,我什至不知道从哪里开始:)。

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

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

好吧,与其尝试替换它们并运行 x 次搜索,我建议使用 mysql 函数LIKE ie

SELECT * FROM x WHERE search LIKE '%ber'

你必须用"%替换变音符号的地方。

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

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

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

让我们知道这是如何解决的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM