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 サイトの他の関連記事を参照してください。