无法使用" ="找到行当然存在的操作

时间:2016-09-12 10:48:28

标签: mysql mariadb

以下语句返回空集。

SELECT id,field_DOMid FROM korektura WHERE field_DOMid = 'vyznam-1284--vyklad_vyznamu' ORDER BY cts DESC LIMIT 1;

但是看看LIKE的结果(值就在那里):

Conole output

任何人都可以提出可能导致这种行为的原因吗?是MySQL服务器问题,整理问题? (我们在collat​​ions / index.xml中使用为UTF8字符集定义的自定义排序规则)

没有尾随空格:

mysql> SELECT field_DOMid, CHAR_LENGTH(field_DOMid),  CHAR_LENGTH(TRIM(field_DOMid)) FROM korektura WHERE id=27580;
 +-----------------------------+--------------------------+--------------------------------+
| field_DOMid                 | CHAR_LENGTH(field_DOMid) | CHAR_LENGTH(TRIM(field_DOMid)) |
+-----------------------------+--------------------------+--------------------------------+
| vyznam-1284--vyklad_vyznamu |                       27 |                             27 |
+-----------------------------+--------------------------+--------------------------------+
1 row in set (0.00 sec)

更重要的是,MySQL文档说:

  

所有MySQL排序规则都是PADSPACE类型。这意味着MySQL中的所有CHAR,VARCHAR和TEXT值都会进行比较,而不考虑任何尾随空格。

提前致谢!

3 个答案:

答案 0 :(得分:0)

我能想到的唯一原因是,如果你在" vyznam"之前有空格或换行符。试着检查一下。

答案 1 :(得分:0)

如果有人遇到这样的问题,我的解决方案是重建索引(表):

mysqldump db_name > dump.sql
mysql db_name < dump.sql

或使用此处描述的其他methotds:https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html

答案 2 :(得分:0)

尝试此查询进行调试:

SELECT field_DOMid, LENGTH(field_DOMid), LENGTH(TRIM(field_DOMid)) , CHAR_LENGTH(field_DOMid),  CHAR_LENGTH(TRIM(field_DOMid)) FROM korektura WHERE id=27580;

如果LENGTH()返回超过27,则意味着第一个字符可能使用双字节字符编码(在UTF-8中是合法的)。因此,如果您想将其与文字字符串匹配,则必须首先convert

SELECT id,field_DOMid FROM korektura WHERE field_DOMid = convert('vyznam-1284--vyklad_vyznamu' using utf8) ORDER BY cts DESC LIMIT 1;