【问题标题】:MySQL Stored procedure Need to compare 2 columns with different collation sequencesMySQL存储过程需要比较2列具有不同的排序规则
【发布时间】:2016-09-16 20:49:55
【问题描述】:

我有一个这样的 MySql 存储过程

CREATE DEFINER=`uwcrossword`@`%` PROCEDURE `sp_UpdCodePage`(IN in_id int, 
IN nm varchar(25), IN nis varchar(25), IN lang varchar(25), 
IN stpt varchar(5), IN endpt varchar(5))
BEGIN
UPDATE `uwcrossword`.`CODEPAGE`
SET
`ID` = in_id,
`Name` = nm,
`NameInScript` = nis,
`Language` = lang,
`StartPoint` = stpt,
`EndPoint` = endpt
WHERE [`ID` = in_id COLLATE utf8-general-ci] 
AND [Language = lang COLLATE utf8-unicode-ci];
END

ID 列没有特定的排序规则。 Language 列有排序规则 utf8-unicode-ci

 我得到的错误

MySQL 说:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 11 行的 '[`ID` = in_id COLLATE utf8-general-ci] AND [Language = lang COLLATE utf8-unicode' 附近使用正确的语法

当我尝试在没有任何排序信息的情况下运行相同的文件时

CREATE DEFINER=`uwcrossword`@`%` PROCEDURE `sp_UpdCodePage`(IN in_id int, 
IN nm varchar(25), IN nis varchar(25), IN lang varchar(25), 
IN stpt varchar(5), IN endpt varchar(5))
BEGIN
UPDATE `uwcrossword`.`CODEPAGE`
SET
`ID` = in_id,
`Name` = nm,
`NameInScript` = nis,
`Language` = lang,
`StartPoint` = stpt,
`EndPoint` = endpt
WHERE [`ID` = in_id] 
AND [Language = lang];
END

MySQL 说:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '[`ID` = in_id ] 附近使用的正确语法 AND [Language = lang]' 在第 13 行

【问题讨论】:

    标签: mysql stored-procedures unicode where-clause collation


    【解决方案1】:

    Expression Syntax 中所述,simple_expr 语法产生式可以产生(expr [, expr] ...)。注意括号是圆的,不是方的。

    但是,在这种情况下,括号不是必需的:

    CREATE DEFINER=`uwcrossword`@`%` PROCEDURE sp_UpdCodePage(
      IN in_id INT,
      IN nm    VARCHAR(25),
      IN nis   VARCHAR(25),
      IN lang  VARCHAR(25), 
      IN stpt  VARCHAR(5),
      IN endpt VARCHAR(5)
    )
    
      UPDATE uwcrossword.CODEPAGE
      SET    ID           = in_id,
             Name         = nm,
             NameInScript = nis,
             Language     = lang,
             StartPoint   = stpt,
             EndPoint     = endpt
      WHERE  ID           = in_id COLLATE utf8-general-ci
         AND Language     = lang  COLLATE utf8-unicode-ci
    
    ;
    

    【讨论】:

    • 谢谢@eggyal 我意识到可以通过不比较具有不同排序规则的两列来避免错误。早些时候,我在 Language 列上添加了一个唯一索引,这让我添加了它以进行比较。我删除了那个唯一键,现在只需要比较 id 列。
    • INT 没有排序规则,因此在 ID = in_id 上是不必要的。
    • @RickJames:好地方!我只是从问题中盲目复制。
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多