在 LOCATE 中使用用户定义的变量时,MySQL 非法混合排序规则

Posted

技术标签:

【中文标题】在 LOCATE 中使用用户定义的变量时,MySQL 非法混合排序规则【英文标题】:MySQL Illegal mix of collations when using user-defined variables inside LOCATE 【发布时间】:2019-10-20 08:25:28 【问题描述】:

我有一个类似下面的查询来从表列中删除某些以特定子字符串开头和结尾的子字符串:

UPDATE om_posts SET post_content=REPLACE(post_content, SUBSTRING(
    post_content, 
    LOCATE(' style="', post_content), 
    LOCATE('"', post_content, LOCATE(' style="', post_content  )+ 8) - LOCATE(' style="', post_content ) + 1
),'')
where post_type="post";

我想让它更好地重用,所以我想抽象出那些字符串。我在 mysql 中遇到了用户定义的变量,并像这样重构:

SET @beginning = ' style="';
SET @ending ='"';

UPDATE om_posts SET post_content=REPLACE(post_content, SUBSTRING(
    post_content, 
    LOCATE(@beginning, post_content), 
    LOCATE(@ending, post_content, LOCATE(@beginning, post_content  )+ 8) - LOCATE(@beginning, post_content ) + 1
),'')
where post_type="post";

但这会产生错误:Error in query (1267): Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation 'locate'。据我所知,我的语法应该是正确的。我错过了什么?

【问题讨论】:

我需要解决的排序规则问题很少;但也许这会有所帮助。 docs 它似乎专注于带有文字的SELECTs,但可能适用于SET操作右侧使用的值。 @Uueerdo 非常好,感谢您的帮助。我对 SQL 很不熟悉。我只是明确地声明了对utf8mb4_unicode_ci 的归类,它起作用了。如果你想添加你的答案,我会接受它:P 有时经验只是意味着知道正确的搜索词。 ;) 【参考方案1】:

每个字符串文字都有一个字符集和一个排序规则。

对于简单语句 SELECT 'string',字符串具有 连接默认字符集和排序规则由 character_set_connection 和 collat​​ion_connection 系统变量。

一个字符串字面量可以有一个可选的字符集 介绍者和 COLLATE 子句,将其指定为使用 特定的字符集和排序规则:

[_charset_name]'string' [COLLATE collat​​ion_name]

来自official documentation

该页面的示例:_utf8mb4'abc' COLLATE utf8mb4_danish_ci

【讨论】:

以上是关于在 LOCATE 中使用用户定义的变量时,MySQL 非法混合排序规则的主要内容,如果未能解决你的问题,请参考以下文章

mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0

如何放大用户当前位置?

Linux学习总结(十五)文件查找 which whereis locate find

Mysq的安装

Linux上查找

如何在centOS下使locate命令起作用