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