问题:我正在尝试实现一种搜索算法,即使提供了点缀字符也可以显示结果。换句话说: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_diacritic不敏感。我什至不知道从哪里开始,:)。
2)使用正则表达式和字符组:/ [uü] ber /
3)解决方案。我个人会用到它,因为设计全是折衷方案,这是一个简单的解决方案,仅占用100%的空间。当然,空间开销最终可能会变成速度开销,尤其是对于MySQL,但这是以后要担心的问题。如果需要,这也很容易撤消。
只需使用适当的排序规则。例如:
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';
这将给您两行。
[查看此帖子:https://stackoverflow.com/questions/500826
他正面临与您相反的问题。查看所选答案中的WHERE子句。可能您只需要使用_ci
后缀即可。
让我们知道如何解决。
嗯,我建议不要使用mysql函数LIKE
,即尝试替换它们,并运行x次搜索。>
SELECT * FROM x WHERE search LIKE '%ber'
必须将变音符号替换为
"%
的地方。
编辑:我的错误%
替换了任意数量的字符。使用_
表示一个字符。