在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 collat​​ion_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不适用于整个查询;不同部分的整理方式可能不同。)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...