无法找到带有肯定存在的“=”操作的行
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;
下面语句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;