mysql重音不敏感和点分不敏感搜索

问题描述 投票:6回答:4

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

$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'都将返回,但结果并非如此。如上所述,我创建了一个新列,并将全名存储为英文字符,并从中进行搜索。但是仍然要花两次时间搜索我的内容(因为我也在搜索结果中排名较高的原始列中进行搜索)。应该有更好的方法...

php mysql search
4个回答
2
投票

1)编写您自己的归类。 latin1_general_diacritic不敏感。我什至不知道从哪里开始,:)。

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

3)解决方案。我个人会用到它,因为设计全是折衷方案,这是一个简单的解决方案,仅占用100%的空间。当然,空间开销最终可能会变成速度开销,尤其是对于MySQL,但这是以后要担心的问题。如果需要,这也很容易撤消。


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';

这将给您两行。


0
投票

[查看此帖子:https://stackoverflow.com/questions/500826

他正面临与您相反的问题。查看所选答案中的WHERE子句。可能您只需要使用_ci后缀即可。

让我们知道如何解决。


0
投票

嗯,我建议不要使用mysql函数LIKE,即尝试替换它们,并运行x次搜索。>

SELECT * FROM x WHERE search LIKE '%ber'

必须将变音符号替换为"%的地方。

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

© www.soinside.com 2019 - 2024. All rights reserved.