如何在程序

时间:2016-09-05 01:06:38

标签: mysql sql stored-procedures character-encoding

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

  • 非法混合操作'concat'

当我使用存储的PROCEDURE时,似乎只会发生这种情况。 之谜是所有字符串都是脚本中的文字,我原本预计它们都拥有相同的整理顺序。关于这个问题有几个问题,但没有一个与我能看到的这类问题有关(我在下面列出了一个列表或者其他找到这个问题的人)。

该脚本使用存储的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)在第241行文件中:'d:\ work \ test.sql':
  • 操作'concat'的非法混合排序

然而 WHEN 我在@SCRIPT_NAME之外的procedure进行了分配,并对该行进行了评论:

     --  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似乎使用了不同的排序规则。我想要的是如何调用该过程而没有此错误。我不希望在@SCRIPT_NAME程序之外设置new_script的值。

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

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

相关

1 个答案:

答案 0 :(得分:0)

SHOW PROCEDURE ...

当你CREATEd SP时,你会看到一个字符集/整理。 DROP SP,SET NAME ...;并重新CREATE SP。