gpt4 book ai didi

php - mysql重音不敏感和点不敏感搜索

转载 作者:可可西里 更新时间:2023-11-01 06:49:11 24 4
gpt4 key购买 nike

问题:我正在尝试实现一种搜索算法,即使在提供点分字符时也能显示结果。换句话说: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”,但事实并非如此。正如我上面提到的,我创建了一个新列并以英文字符存储整个名称,并从那里进行搜索。但是,这仍然花费了我两次搜索(因为我也是从搜索结果中排名较高的原始列中搜索的)。应该有更好的方法...

最佳答案

1) 编写自己的归类。 latin1_general_diacriticinsensitive。不过,我什至不知道从哪里开始:)。

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

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

关于php - mysql重音不敏感和点不敏感搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com