すべてのテーブルはutf_unicode_ci
にあります。
チェックするためにこれを行いました
SELECT table_schema, table_name, column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE collation_name <> 'utf8_unicode_ci' AND table_schema LIKE 'my_database'
ORDER BY table_schema, table_name, ordinal_position;
そして念のためにすべてのテーブルを変換しました
ALTER TABLE `my_database`.`table_name` DEFAULT COLLATE utf8_unicode_ci;
ALTER TABLE `my_database`.`table_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
データベース照合設定はutf8_unicode_ci
にあります。
文字セットは
mysql> 'char%'のような変数を表示; + -------------------------- +- -------------------------- + |変数名|値| + -------------------------- + --------------- ------------- + | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem |バイナリ| | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir |/usr/share/mysql/charsets/| + -------------------------- + ------- --------------------- + 8行のセット(0.02秒)
照合は
mysql> 'colla%'のような変数を表示; + ---------------------- + ----------- ------ + |変数名|値| + ---------------------- + ----------------- + | collation_connection | utf8_unicode_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | + ---------------------- + ----------------- + 3行のセット(0.00秒)
このエラーは、Webブラウザーを介して、またはmysql bashクライアントを介してストアドプロシージャを呼び出すかどうかに関係なく発生します。 ubuntu/linuxのロケール設定が次の場合に備えて:
$ locale LANG = es_ES.UTF-8 LANGUAGE = es_ES.UTF-8 LC_CTYPE = es_ES.UTF-8 LC_NUMERIC = "es_ES.UTF- 8 " LC_TIME =" es_ES.UTF-8 " LC_COLLATE = es_ES.UTF-8 LC_MONETARY =" es_ES.UTF-8 " LC_MESSAGES = es_ES .UTF-8 LC_PAPER = "es_ES.UTF-8" LC_NAME = "es_ES.UTF-8" LC_ADDRESS = "es_ES.UTF-8" LC_TELEPHONE = "es_ES.UTF-8" LC_MEASUREMENT = "es_ES.UTF-8" LC_IDENTIFICATION = "es_ES.UTF-8" LC_ALL =
私がこの問題を解決できた唯一の方法は、エラーを引き起こす各クエリ内でconvert
を使用する(またはクエリ内でCOLLATE
を使用する)ことですが、問題はたくさんあることです非常に複雑なストアドプロシージャであるため、「悪い」クエリを特定することは難しく、時間がかかります。
私のシステム(ubuntu:mysqlクライアント、ブラウザ)からストアドプロシージャに渡された変数はどういうわけかutf8_general_ciで送信されているため、データベースのut8_unicode_ciと競合します。
Mysql接続がutf_unicode_ciに設定されていても、OSはutf8_general_ciで動作しているようです。
私は自分の問題を解決し、移行中の誤った変換が原因でしたが、utf8_unicode_ciの代わりにutf_general_ciに変換していました。そのため、mysqlデータベース構造は正しいものの、ソースデータは誤ったエンコード(utf8_general_ci)でエンコードされ、mysql ddbbに挿入されましたそのように。
そのため、mysqlデータベースに適切な文字セットと照合順序を設定しても、データが別の照合順序に含まれているため、「照合順序の不正な混合」エラーが発生する可能性があります。
これが将来誰かに役立つことを願っています。
誰かを助ける場合、異なるサーバーの異なるデータベースでクエリを実行しているときに同じエラーが発生しました。エラーが発生したのは、他からの移行でした。私たちの場合は、mysql.iniの「collation_server」を変更し、mysqlサービスを再起動することで修正されました。
エンコードと照合の設定が適切になったら、ストアドプロシージャとストアドファンクションを再インポートすると、問題が解決します。同じ正確な問題に遭遇しました。トラブルシューティングに役立つもう1つのmysqlネイティブ関数:テーブルデータ形式に問題があると思われる場合は、some_tableからcollation(some_col)を選択します。
CHARSET utf8をパラメーターリストに追加した後、問題を解決しました。これは他の人に十分に役立つかもしれません、
PROCEDURE `USP_USR_AuthenticateUser`(
IN ip_username VARCHAR(50) CHARSET utf8**,
IN ip_pwd NVARCHAR(256)
)