我想检查同一张表的两列中有多少条记录具有相等的值。我从第二列中提取正则表达式,并将其与第一列进行比较。
select count(*)
from tbl
where col1 = REGEXP_REPLACE(col2, 'https?://([A-Za-z]+).*', '$1');
我收到此错误:
错误代码:1267。非法的排序规则混合 (latin1_swedish_ci,IMPLICIT)和(utf16le_general_ci,COERCIBLE)用于 操作'='
col1的类型为LONGTEXT,而col2的类型为VARCHAR。两者在字段属性中均具有默认字符集和默认排序规则。
我使用MySQL Workbench 8和MySQL 8 +。
为什么会出现此错误?如何解决问题并运行查询并即时比较两个值,而无需创建新列,并使用正则表达式更新表。
编辑:
数据示例:
col1 | col2
==============================================
dev | https://dev.mysql.com/doc/
编辑2: 完整的测试用例:
表格:
CREATE TABLE `test` (
`url` varchar(1500) NOT NULL,
`regex` varchar(1500) DEFAULT NULL,
PRIMARY KEY (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
数据(用逗号分隔的列):
https://dev.mysql.com/doc/refman/, dev
https://mail.google.com/mail/u, mail
选择查询:
SELECT REGEXP_REPLACE(`test`.`url`, 'https?://([A-Za-z]+).*', '$1')
FROM myschema.test;
结果:
dev
mail
无效查询
select count(*)
from myschema.test
where `test`.`regex` = REGEXP_REPLACE(`test`.`url`, 'https?://([A-Za-z]+).*', '$1');
错误:
Error Code: 1267. Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf16le_general_ci,COERCIBLE) for operation '='
预期结果:
https://dev.mysql.com/doc/refman/, dev
https://mail.google.com/mail/u, mail