sql >> データベース >  >> RDS >> Mysql

操作'='の照合(utf8_unicode_ci、IMPLICIT)と(utf8_general_ci、IMPLICIT)の不正な組み合わせ

    ストアドプロシージャパラメータのデフォルトの照合は、utf8_general_ciです。 照合を混在させることはできないため、次の4つのオプションがあります。

    オプション1COLLATEを追加します 入力変数へ:

    SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
    CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
    

    オプション2COLLATEを追加します WHEREへ 条項:

    CREATE PROCEDURE updateProductUsers(
        IN rUsername VARCHAR(24),
        IN rProductID INT UNSIGNED,
        IN rPerm VARCHAR(16))
    BEGIN
        UPDATE productUsers
            INNER JOIN users
            ON productUsers.userID = users.userID
            SET productUsers.permission = rPerm
            WHERE users.username = rUsername COLLATE utf8_unicode_ci -- COLLATE added
            AND productUsers.productID = rProductID;
    END
    

    オプション3INに追加します パラメータ定義(MySQL 5.7より前):

    CREATE PROCEDURE updateProductUsers(
        IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci, -- COLLATE added
        IN rProductID INT UNSIGNED,
        IN rPerm VARCHAR(16))
    BEGIN
        UPDATE productUsers
            INNER JOIN users
            ON productUsers.userID = users.userID
            SET productUsers.permission = rPerm
            WHERE users.username = rUsername
            AND productUsers.productID = rProductID;
    END
    

    オプション4 :フィールド自体を変更します:

    ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
    

    Unicode順にデータを並べ替える必要がない限り、すべてのテーブルを変更してutf8_general_ciを使用することをお勧めします。 コードを変更する必要がなく、ソートがわずかに高速化されるため、照合。

    更新 :utf8mb4 / utf8mb4_unicode_ciが、推奨される文字セット/照合方法になりました。パフォーマンスの向上はごくわずかであるため、utf8_general_ciは使用しないことをお勧めします。 https://stackoverflow.com/a/766996/1432614 を参照してください



    1. ORA-010179iクライアントから11gデータベースに接続するときにユーザー名/パスワードが無効です

    2. 可変数の入力パラメーターを持つ関数

    3. MySQL Galeraクラスターストリーミングレプリケーションのガイド:パート1

    4. SQL Server(T-SQL)のデータベースメールキューのステータスを確認する