web-dev-qa-db-ja.com

ストアドプロシージャ内の照合(utf8_general_ci、IMPLICIT)と(utf8_unicode_ci、IMPLICIT)の不正な組み合わせ

  1. すべてのテーブルは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;         
    
  2. データベース照合設定は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%'のような変数を表示; 
     + ---------------------- + ----------- ------ + 
     |変数名|値| 
     + ---------------------- + ----------------- + 
     | collat​​ion_connection | utf8_unicode_ci | 
     | collat​​ion_database | utf8_unicode_ci | 
     | collat​​ion_server | utf8_unicode_ci | 
     + ---------------------- + ----------------- + 
     3行のセット(0.00秒)
  3. このエラーは、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で動作しているようです。

15
Packet Tracer

私は自分の問題を解決し、移行中の誤った変換が原因でしたが、utf8_unicode_ciの代わりにutf_general_ciに変換していました。そのため、mysqlデータベース構造は正しいものの、ソースデータは誤ったエンコード(utf8_general_ci)でエンコードされ、mysql ddbbに挿入されましたそのように。

そのため、mysqlデータベースに適切な文字セットと照合順序を設定しても、データが別の照合順序に含まれているため、「照合順序の不正な混合」エラーが発生する可能性があります。

これが将来誰かに役立つことを願っています。

18
Packet Tracer

誰かを助ける場合、異なるサーバーの異なるデータベースでクエリを実行しているときに同じエラーが発生しました。エラーが発生したのは、他からの移行でした。私たちの場合は、mysql.iniの「collat​​ion_server」を変更し、mysqlサービスを再起動することで修正されました。

2
ohcnim

エンコードと照合の設定が適切になったら、ストアドプロシージャとストアドファンクションを再インポートすると、問題が解決します。同じ正確な問題に遭遇しました。トラブルシューティングに役立つもう1つのmysqlネイティブ関数:テーブルデータ形式に問題があると思われる場合は、some_tableからcollat​​ion(some_col)を選択します。

1
ymgoldman

CHARSET utf8をパラメーターリストに追加した後、問題を解決しました。これは他の人に十分に役立つかもしれません、


   PROCEDURE `USP_USR_AuthenticateUser`(
      IN ip_username VARCHAR(50) CHARSET utf8**,
      IN ip_pwd NVARCHAR(256)
   )
0
murlid05