无法找到带有肯定存在的“=”操作的行

Unable to find row with "=" operation that certainly exists

下面语句returns空集。

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

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

任何人都可以提出导致这种行为的原因吗?是MySQL服务器问题,整理问题吗? (我们使用为 collations/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 文档说:

All MySQL collations are of type PADSPACE. This means that all CHAR, VARCHAR, and TEXT values in MySQL are compared without regard to any trailing spaces.

提前致谢!

我能想到的唯一原因是 space 或 "vyznam" 之前的换行符。尝试检查一下。

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

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

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

尝试使用此查询进行调试:

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() returns大于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;