【发布时间】:2012-06-05 13:28:15
【问题描述】:
我在“utf8 -- UTF-8 Unicode”中有一个模式作为字符集和“utf8_spanish_ci”的排序规则。
所有内部表都是 InnoDB,具有相同的字符集和排序规则。
问题来了:
使用类似的查询
SELECT *
FROM people p
WHERE p.NAME LIKE '%jose%';
我得到 83 个结果行。我应该有 84 个结果,因为我知道。
更改位置:
WHERE p.NAME LIKE '%JOSE%';
我得到完全相同的 83 行。 使用 JoSe、Jose、JOSe 等组合。报告所有相同的 83 行。
当重音在游戏中出现时,问题就出现了。如果这样做:
WHERE p.NAME LIKE '%josé%';
我没有得到任何结果。 0 行。
但如果我这样做:
WHERE p.NAME LIKE '%JOSÉ%';
我只得到一个结果行,所以 1 行。这是唯一带有重音“jose”并大写的行。
我尝试过使用 josÉ 或 JoSÉ 或我所做的任何组合,只要重音字母是否保持大写,因为它确实存储在数据库中并且它仍然返回唯一的行。如果我突然用 JOSE 中的大写字母组合将“É”更改为“é”,它不会返回任何行。
所以结论:
- 如果游戏中没有拉丁字符,则不区分大小写。
- 如果出现拉丁字符,则区分大小写。
- 重音敏感,就像我搜索 JOSE 或 jose 一样,我只得到 83 行,而不是我需要的 84 行。
我想要什么?
- 要搜索“jose”、“JOSE”、“José”、“JOSÉ”、“JÒSE”、“jöse”、“JoSÈ”……必须返回我知道存在的 84 行。我如何将我的搜索变成不区分大小写和不区分“拉丁”的。
LIKE 上的 COLLATION 之类的解决方案对我不起作用,不知道为什么...
我能做什么?
编辑:
如果我这样做:
WHERE p.NAME LIKE '%jose%' COLLATE utf8_general_ci;
我得到错误:
COLLATION 'utf8_general_ci' 对 CHARACTER SET 'latin1' 无效
我也更改了列上所有可能的排序规则!
如果我这样做:
WHERE p.NAME LIKE _utf8 '%jose%' COLLATE utf8_general_ci;
同样的83行报出来,好像我什么都没做……
【问题讨论】:
-
您找到解决方案了吗?我在使用字符“ã”和“Ô的数据库中遇到同样的问题。如果我搜索“joao”,它将检索“joao”和“Joao”,这意味着它会找到具有不同大小写的单词,但不会找到带有重音的单词。如果我搜索“João”,它不会检索 A 大写为“JOÃO”的记录。我什至尝试创建一个包含 4 个字段和 4 个不同排序规则(ut8_general_ci、utf8_unicode_ci、utf8_bin 和 latin1_general_ci)的表来插入相同的项目并尝试使用每一列进行搜索,但还没有找到解决方案......跨度>
标签: mysql utf-8 case-insensitive non-ascii-characters