如何解决在MySQL 5.6中比较整数与显式排序规则时如何避免无效错误
好的,这不是有史以来最清晰的标题;随时改善。
我有一张表格,代表数千种语言形式。其中许多都大量使用变音符号,因此 aha , áha̱ 和 ā̧́ḫà̀ 都可能出现。该表(和数据库)使用UTF-8作为字符集,并使用utf8mb4_unicode_520_ci
作为默认归类方案,因为搜索应区分大小写和变音符(因此搜索 aha 应该带来全部三个)。这些表格都是由人工手动输入的,因此不可避免地会有重复。
我目前正在尝试获取完全相同形式的列表,以消除重复(手动-每个令牌都必须在删除之前进行检查),但是在这种情况下,我需要在变音符号中进行搜索-感知方式–也就是说,鉴于上面列出的三个标记,由于变音符号,它们是三种不同的形式,因此我希望搜索不会产生结果。
我认为这应该是一个相当容易的任务;只是做:
SELECT token FROM table GROUP BY token HAVING COUNT(token) > 1 COLLATE utf8mb4_bin
但是a,那行不通。相反,它给我一个错误消息,即“ COLLATION utf8mb4_bin对字符集latin1无效”。我应该注意,我在任何地方都没有拉丁文-1,没有字符集,没有排序规则,没有服务器字符集,也没有。也没有存储过程或其他可能会出现Latin-1的内容。
不,这是因为this bug,显然是从5.7开始固定的;请参阅底部的说明:
对于诸如ORDER BY numeric_expr COLLATE collation_name的构造,表达式的字符集被视为latin1,如果在COLLATE之后指定的排序规则与latin1不兼容,则会导致错误。现在,当在存在COLLATE的情况下将数字表达式隐式转换为字符表达式时,使用的字符集就是与命名排序规则关联的字符集。
很遗憾,我的系统是5.6,并且无法进行升级(烦人)。将数据转换为Latin-1也是一种选择,也不能更改表的排序规则。
有没有一种方法可以运行我的查询或等效的查询,而不产生排序规则错误?
解决方法
SET NAMES utf8mb4;
CREATE TABLE x(s VARCHAR(11) COLLATE utf8mb4_unicode_520_ci NOT NULL);
INSERT INTO x (s)
VALUES ('aha'),('áha̱'),('ā̧́ḫà̀'),('i'),('i̯');
SELECT s FROM x GROUP BY s HAVING COUNT(*) > 1;
回来
啊哈 我
没有对数字内容的任何抱怨。
我在5.6.46、5.7.26、8.0.16和多个MariaDB版本上运行它。
我在做什么与您的情况不同?
添加重复的COLLATE
子句时,请将其放在需要它的查询组件中。 (COLLATE
不适用于整个查询;不同部分的整理方式可能不同。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。