mysql:错误代码[1267]; 操作'='的非法混合排序(latin1_general_cs,IMPLICIT)和(latin1_swedish_ci,IMPLICIT)

Dar*_*Fan 1 mysql sql mysql-error-1267

我想让password我的User表的列case sensitive在mysql中.

以下是该表的描述:

/*Table: mst_user*/

   FIELD          TYPE          COLLATION        
-------------  ------------  -----------------
user_id        VARCHAR(100)  latin1_swedish_ci
first_name     VARCHAR(25)   latin1_swedish_ci
last_name      VARCHAR(25)   latin1_swedish_ci
USER_PASSWORD  VARCHAR(50)   latin1_swedish_ci
user_status    INT(11)       (NULL)           
version_id     INT(11)       (NULL)           
active_status  INT(11)       (NULL)           
user_type      INT(11)       (NULL)    
Run Code Online (Sandbox Code Playgroud)

为了使USER_PASSWORD字段区分大小写,我执行以下查询:

ALTER TABLE `mst_user` MODIFY `USER_PASSWORD` VARCHAR(50) COLLATE `latin1_general_cs`;
Run Code Online (Sandbox Code Playgroud)

这种方法很有效,现在该字段区分大小写.

但我有一个存储过程,它SELECT在此表上执行查询以检查用户是否存在给定的凭据.

存储过程::

CREATE PROCEDURE `usp_password_verify`(ip_login_id         VARCHAR(200),
                                 ip_user_password    VARCHAR(200),
                                INOUT success     INT(1),
INOUT tbl_usr_password          VARCHAR(100),
INOUT  pkg_user_password         VARCHAR(100))
BEGIN
  SELECT COUNT(*)
    INTO success
    FROM mst_user
   WHERE UPPER (user_id) = UPPER (ip_login_id)
   AND USER_PASSWORD=ip_user_password;

   SET tbl_usr_password = '';
   SET pkg_user_password= '';
END$$
Run Code Online (Sandbox Code Playgroud)

当我从我的java代码调用这个存储过程时,我收到以下错误:

**error code [1267]; Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='**
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助解决这个问题吗?作为简单查询工作的东西在存储过程中执行它时会出错!

egg*_*yal 7

表达式排序规则所述:

MySQL按如下方式分配强制值:

[ deletia ]

  • 列或存储的例程参数或局部变量的整理具有2的强制性.

[ deletia ]

MySQL使用具有以下规则的强制性值来解决歧义:

[ deletia ]

  • 如果双方具有相同的强制性,那么:

    • 如果双方都是Unicode,或双方都不是Unicode,那就是错误.

可以COLLATE在表达式中添加显式子句,以强制其中一个操作数具有较低的强制性值的显式排序规则:

USER_PASSWORD=ip_user_password COLLATE 'latin1_general_cs'
Run Code Online (Sandbox Code Playgroud)

latin1_bin在这种情况下你甚至可能想考虑一下?

无论如何,您不应该以明文存储密码.相反,存储用户密码的盐渍哈希值,并简单地验证哈希值与存储的哈希值匹配.