【问题标题】:How to avoid "Illegal mix of collations for operation 'concat'" in procedure如何在程序中避免“操作'concat'的排序规则的非法混合”
【发布时间】:2016-09-05 01:06:37
【问题描述】:

我发现了一个无法解释的实例:

  • "操作“concat”的排序规则的非法混合"

这似乎只在我使用存储的PROCEDURE 时发生。 奥秘 是脚本中的所有字符串都是文字,我原以为它们都具有 same 整理顺序。对此有几个问题,但没有一个与我可以看到的此类问题相关(我在下面粘贴了一个列表,供其他找到此问题的人使用)。

脚本使用存储的procedure 来做一个简单的标题。这是原始的“设计”:

 DELIMITER $$$
 CREATE PROCEDURE    new_script( IN  label   VARCHAR(50) )
 BEGIN
     set @SCRIPT_NAME=label;

     set @script_count:=@script_count+1;
     set @script_error_count:=0;

     set @sqlstmt := concat('select \'', @DASHES, '\' as \'', @SCRIPT_NAME, ': starting ...\'');

     PREPARE stmt FROM @sqlstmt;
     EXECUTE stmt;    

     DROP PREPARE stmt; 
 END$$$  -- new_script
 DELIMITER ;

concat() 语句失败并显示:

  • ERROR 1271 (HY000) at line 241 in file: 'd:\work\test.sql':
  • “concat”操作的排序规则的非法混合

但是WHEN我在procedure之外分配了一个@SCRIPT_NAME并注释掉该行:

     --  set @SCRIPT_NAME=label;

如图所示,一切正常!例如:

  set @SCRIPT_NAME='dummy_script.sql';

  call new_script( 'IGNORED dummy_script.sql' );   

输出:

  +--------------------------------------------------+
  | dummy_script.sql: starting ...                   |
  +--------------------------------------------------+
  |   ---------------------------------------------- |
  +--------------------------------------------------+

根据需要。

玩了一会儿之后,我相信问题出在从参数:label 到脚本变量:@SCRIPT_NAME 的赋值上。

label 似乎使用了不同的排序规则。我想要的是如何调用该过程并且没有此错误。我不希望在new_script 过程之外设置@SCRIPT_NAME 的值。

  • 是否有指定 SQL 脚本排序顺序的方法? (类似于 XML 标头)。这样我就可以告诉 MYSQL 对 everything 使用相同的排序规则。
  • 有没有办法找到 SQL 脚本本身使用的整理顺序?
  • 我可以控制存储过程中使用的排序顺序吗?
  • 说真的,为什么 MYSQL 会这样做?

或者也许您有比这些想法更好的方法 -- 请分享?


相关:

【问题讨论】:

  • 作为注释(与您的问题相关的注释),但在 SQL 字符串中获取单引号的正常方法是将其加倍。所以:'select ''' 而不是 'select \''。
  • 是的,您可以一次覆盖一个字符串
  • 这个答案stackoverflow.com/a/27226815或者手册页怎么样,然后搜索单词排序规则dev.mysql.com/doc/refman/5.7/en/create-procedure.html或者页面上的所有用户cmets
  • 存储过程在编译时会修复它们的排序规则和字符集。如果您使用不同的排序规则连接到 mysql 并将变量传递给您的存储过程,那么您会收到此错误消息。要么显式强制所有字符串在存储过程中具有相同的排序规则,要么确保使用存储过程中设置的相同排序规则连接到 mysql。
  • 是的,听起来像是通向整理地狱的途径——相同的脚本在 MySQL 工作台中工作,而不是在命令行客户端中工作。最好的方法似乎是为与您当前使用的模式匹配的脚本建立一个字符集。我快速查看了一下,可能需要考虑 4 或 5 个会话设置。 . .

标签: mysql sql stored-procedures character-encoding


【解决方案1】:
SHOW PROCEDURE ...

当您CREATEd SP 时,您将看到一个字符集/排序规则已建立。 DROP SP,SET NAME ...; 和 re-CREATE SP。

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2014-05-20
    • 2014-12-03
    相关资源
    最近更新 更多