以下语句返回空集。
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文档说:
所有MySQL排序规则都是PADSPACE类型。这意味着MySQL中的所有CHAR,VARCHAR和TEXT值都会进行比较,而不考虑任何尾随空格。
提前致谢!
答案 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;