在花了我几乎一整天的时间来解决这个问题之后,我来找你们。
我需要在我的数据库(InnoDB)上进行不区分重音的单词搜索,但我无法让它工作。
我有t1
表,该字段description
是 indexed varchar(250)
,此外我的表排序规则是utf8_general_ci
.
t1
有一个记录,以防您想知道记录是如何存储的description
。bla bla... instrucción... bla.
我正在尝试使用单词instrucción
并instruccion
使用以下方法获取记录:
SELECT id FROM t1 WHERE description LIKE '%instruccion%'
如果我使用instrucción
我得到一个非空结果,但使用instruccion
我得到一个空结果。
请帮助和感谢。
“ mysql 重音不敏感搜索”的 Google 会生成带有各种“技巧”的各种链接——这些链接似乎都使您可能在您的桌子上拥有的任何索引无效。
几年前,我不得不为可能包含口音的爱尔兰名称和地址实施类似的方法。
策略(如果您的 RDBMS 不支持不区分重音的搜索)是使用一个阴影列来跟踪“基本”单词 - 在我们的例子中,没有重音、大写和删除空格,这样当带有名称的记录时:
是
INSERT
ed(或UPDATE
d),将存储为然后对影子列进行所有搜索。
在应用程序中,我们在将所有搜索字符串发送到服务器时将它们大写并删除了重音符号和空格,以便搜索与类似比较 - 即未重音、大写、删除空格的字符串。
这具有始终能够使用索引和可跨 RDBMS 服务器移植的双重优势。作为一款爱尔兰应用程序,我们还制定了将 Mac 和 Mc 转换为 MC 的策略,以便将变体拼写也考虑在内 - 也许对您来说也是个问题?
我们使用
TRIGGER
s 来做到这一点 - 但我相信从 MySQL 5.7 开始,支持GENERATED
(也称为VIRTUAL
orCOMPUTED
)列,这可以简化逻辑?您只需要告诉 MySQL 使用不同的排序规则。
所以,在你的情况下:
ci
表示不区分大小写,它使重音和小写字母变平。示例 SQL Fiddle在这里。
知道了!
您必须确保所有各方(您的应用程序、mysql 连接、您的表或列)都将 utf8 设置为字符集。
在我的情况下,我所有的脚本都被路由了,所以我只是将它添加到我的 index.php 中:
确保您的 mysqli 连接在任何操作之前使用 utf8:
当然,使用创建您的表或列
utf8_general_ci