MySQL の「不正な照合順序の組み合わせ」エラーを解決するにはどうすればよいですか?

DDD
リリース: 2024-11-16 10:34:02
オリジナル
532 人が閲覧しました

How to Solve the

MySQL の不正な照合順序の混在エラーに対処する

テキスト データの比較または操作を伴うデータベース操作を実行する場合、一貫性を確保することが重要です文字照合で。 MySQL では、「照合順序が不正に混在しています」というエラー メッセージは通常、操作のオペランドに使用される照合順序間の非互換性を示します。

提供されたコードでは、問題は、次のテーブルとストアド プロシージャ:

CREATE TABLE users ( ... ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE products ( ... ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE productUsers ( ... ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
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
        AND productUsers.productID = rProductID;
END
ログイン後にコピー

ストアド プロシージャの入力パラメータと users テーブルの username 列はデフォルトの照合順序 utf8_general_ci で宣言され、productUsers テーブルの権限列と rPerm パラメータは utf8_unicode_ci 照合順序で宣言されます。 .

この問題を解決するには、いくつかのオプションがあります。

オプション 1: COLLATE を入力変数に追加する

入力に COLLATE 句を追加するストアド プロシージャ内の変数を呼び出して、utf8_unicode_ci 照合順序を明示的に指定します。

$rUsername = 'aname' COLLATE utf8_unicode_ci;
$call = "CALL updateProductUsers(@rUsername, @rProductID, @rPerm);";
ログイン後にコピー

オプション 2: WHERE 句に COLLATE を追加します

COLLATE 句を WHERE 句に追加しますストアド プロシージャ定義で、users.username 列の utf8_unicode_ci 照合順序を指定します。

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
        AND productUsers.productID = rProductID;
END
ログイン後にコピー

オプション 3: COLLATE を IN パラメータ定義に追加します

MySQL バージョンの場合5.7 より前では、ストアド プロシージャ自体の IN パラメーター定義に COLLATE 句を追加できます。

CREATE PROCEDURE updateProductUsers(
    IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci,
    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: テーブル フィールドの変更

utf8_unicode_ci 照合順序を使用するには、users テーブルの username 列を使用します。

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ログイン後にコピー

通常、データの並べ替えには utf8_general_ci の方が高速ですが、より広範囲の Unicode 文字をサポートするため、utf8mb4/utf8mb4_unicode_ci を使用することをお勧めします。

以上がMySQL の「不正な照合順序の組み合わせ」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート