【问题标题】:What is wrong with MySql LIKE operator on utf8_turkish_ci collation?utf8_turkish_ci 排序规则上的 MySql LIKE 运算符有什么问题?
【发布时间】:2017-10-08 05:08:57
【问题描述】:

我有一张如下表:

wordId     |   word      
---------------------------------
1          |   axxe
2          |   test word
3          |   another test word

我正在尝试运行下面的查询以查找以字母“ax”开头的记录。

SELECT * FROM `words` WHERE word LIKE 'ax%'

MySQL 找不到任何东西。

但是,如果我尝试以下查询之一,我可以在结果中看到正确的记录(单词“axxe”)。

SELECT * FROM `words` WHERE word='axxe'

SELECT * FROM `words` WHERE word LIKE '%ax%'

SELECT * FROM `words` WHERE word LIKE 'a%'

为什么 MySQL 不能为第一个查询找到正确的值?我尝试在命令行和 phpMyAdmin 上都运行它,但结果是一样的。

这是 SHOW CREATE TABLE 输出:

CREATE TABLE `words` (
 `wordId` int(11) NOT NULL auto_increment,
 `word` text collate utf8_turkish_ci NOT NULL
 PRIMARY KEY  (`word`)
) ENGINE=MyISAM AUTO_INCREMENT=2853 DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci

【问题讨论】:

  • 为我工作:sqlfiddle.com/#!9/53090/1
  • 我猜你的 'words.word' 列有前面的值(非显示字符,如制表符或空格或回车。SELECT * FROM words WHERE trim(word) LIKE 'ax%' 是否给你 wordid 1?如果是这样你有前导空格如果不是您在 ax 中的 a 之前的 word 中有非显示字符。因为 %ax% 有效,这是一个合理的假设。
  • 您能从实际表格中复制粘贴这四个单词吗?如果axxe 恰好是аххе(看起来一样,但它是西里尔文)MySql 将无法找到它。
  • 相同的会话/窗口?一个窗口使用不同的连接且未提交,另一个未提交但在同一连接上,因此事务仍然打开;因此一个工作另一个不?我抓紧,因为它应该工作;所以这只是我开始考虑的奇怪的东西。
  • 也许是where word like ('ax%' COLLATE utf8_turkish_ci)?基于:stackoverflow.com/questions/25428529/…,因为表列字是在 utf8_turkish_ci @RocketHazmat 中定义的,您能否将您的小提琴更新为土耳其排序规则并尝试看看我们是否可以重现?

标签: mysql sql


【解决方案1】:

TL;DR:

更新您的 MySQL 版本。


我在这里模拟了你的问题:

创建表:

CREATE TABLE `turky` (
 `id` int(5) NOT NULL AUTO_INCREMENT,
 `word` text COLLATE utf8_turkish_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci

插入数据:

INSERT INTO `turky` (`id`, `word`) VALUES
(1, 'axxe'),
(2, 'test word'),
(3, 'axxxxxe'),
(4, 'another test word');

运行测试查询(有效):

SELECT * FROM `turky` WHERE `word`='axxe' 

结果:

1, 'axxe',

运行测试查询 2(有效):

SELECT * FROM `turky` WHERE word LIKE '%ax%'

结果:

1, 'axxe',
3, 'axxxxe',

运行测试查询 3(有效):

SELECT * FROM `turky` WHERE word LIKE 'a%'

结果:

1, 'axxe',
3, 'axxxxe',
4, '另一个测试词';


运行测试查询 4(最初不起作用):

SELECT * FROM `turky` WHERE `word` LIKE 'ax%' 

结果:

1, 'axxe',
3, 'axxxxe',

这适用于 MySQL,使用 PHPMyAdmin。

版本
MySQL:5.6.35
PHPMyAdmin:4.6.6


当前的土耳其语字母表不包含字母“x”,因此这一事实可能 [可能不会] 对 SQL 排序过程造成一些模糊的干扰(例如在缺乏语言指导时正在寻找这个角色)。

MySQL 中的 Web 搜索土耳其语错误,虽然有六个错误,但似乎没有一个是针对您的特定实例的。

但我从我自己的测试(上图)中看到的唯一选择是,使用您提供给我们的表和 SQL 详细信息,您使用的是包含一些土耳其语言错误的旧版本的 MySQL。


如果您的 MySQL 版本是最新的

(或至少,比我的更新)

那么问题似乎特定于您的设置和数据,所以我非常怀疑我们能否找到并重现此问题:-(


更多诊断资料
正如Jacob H 所评论的,请查看转换为二进制文件后是否仍然出现此问题

SELECT * FROM `turky` WHERE BINARY `word` LIKE CONCAT(BINARY 'ax','%'); 

结果:

1, 'axxe',
3, 'axxxxe',

【讨论】:

    猜你喜欢
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2012-12-29
    相关资源
    最近更新 更多