3

passwordUser テーブルの列をcase sensitivemysqlに作成したいと考えています。

テーブルの説明は次のとおりです。

/*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)    

フィールドで大文字と小文字を区別するために、USER_PASSWORD次のクエリを実行しました。

ALTER TABLE `mst_user` MODIFY `USER_PASSWORD` VARCHAR(50) COLLATE `latin1_general_cs`;

これは機能し、フィールドで大文字と小文字が区別されるようになりました。

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$$

このストアド プロシージャを Java コードから呼び出すと、次のエラーが発生します。

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

誰でもこれの何が悪いのか助けてもらえますか? 単純なクエリとして機能するものは、ストアド プロシージャで実行中にエラーが発生します!?

4

4 に答える 4

7

式の照合の下に記載されているように:

MySQL は強制力の値を次のように割り当てます。

[ deletia ]

  • 列または格納されたルーチン パラメータまたはローカル変数の照合には、2 の強制性があります。

[ deletia ]

MySQL は、あいまいさを解決するために、次のルールで強制値を使用します。

[ deletia ]

  • 両側が同じ強制力を持つ場合、次のようになります。

    • 両面が Unicode の場合、または両面が Unicode でない場合はエラーです。

式に明示的な句を追加しCOLLATEて、オペランドの 1 つに強制的に低い強制値を持つ明示的な照合を強制することができます。

USER_PASSWORD=ip_user_password COLLATE 'latin1_general_cs'

この場合、あなたも考慮したいかもしれませんlatin1_binか?

いずれにせよ、パスワードを平文で保存するべきではありません。代わりに、ユーザーのパスワードのソルトハッシュを保存し、そのハッシュが保存されているものと一致することを確認します。

于 2012-11-08T09:01:28.980 に答える