2

MySQL4からMySQL5.5へのデータベースのアップグレードを支援しています。クライアントのアプリケーションサーバーもJDK5からJDK7にアップグレードされました。ただし、アプリケーションは実行されますが、データベース操作の実行時に多くの例外がスローされます。

アップグレードされたデータベースでは、テーブル照合やテーブル列照合でLatin1ジェネリック、Latin1スウェーデン語、UTF8ジェネリックが混在しているため、ほとんどのJOINクエリが失敗することがわかりました。

数百のテーブルと数千のテーブルフィールドがあり、それらすべてを手動で変換することは非常に困難です。

すべてのデータテーブルとすべての列を同じ照合に変換するより便利な方法はありますか?

ありがとうございました。

編集:JOINクエリが失敗したことを示すSQLExceptionメッセージの例:

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

4

1 に答える 1

9

MySQLは必要に応じて文字セット間で変換する必要があるため、文字セットが混在してもクエリが失敗することはありません。

ただし、ALTER TABLE構文で説明されているように:

テーブルのデフォルトの文字セットとすべての文字列(、、)を新しい文字セットに変更CHARするにはVARCHARTEXT次のようなステートメントを使用します。

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

のデータ型VARCHARまたはタイプの1つをTEXT持つ列CONVERT TO CHARACTER SETの場合、新しい列が元の列と同じ数の文字を格納するのに十分な長さになるように、必要に応じてデータ型を変更します。たとえば、TEXT列には2つの長さのバイトがあり、最大65,535までの値のバイト長を列に格納します。列の場合latin1 TEXT、各文字には1バイトが必要であるため、列には最大65,535文字を格納できます。列がに変換される場合utf8、各文字は最大3バイトを必要とする可能性があり、最大可能長は3×65,535=196,605バイトです。その長さは列の長さのバイトに収まらないTEXTため、MySQLはデータ型をに変換しますMEDIUMTEXT、これは、長さバイトが196,605の値を記録できる最小の文字列型です。同様に、VARCHAR列はに変換される場合がありますMEDIUMTEXT

今説明したタイプのデータ型の変更を避けるために、を使用しないでくださいCONVERT TO CHARACTER SET。代わりに、を使用MODIFYして個々の列を変更します。例えば:

ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8;
ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M) CHARACTER SET utf8;

、、、および列を指定するCONVERT TO CHARACTER SET binaryと、対応するバイナリ文字列タイプ(、、、)に変換されます。これは、列に文字セットがなくなり、後続の操作がそれらに適用されないことを意味します。CHARVARCHARTEXTBINARYVARBINARYBLOBCONVERT TO

の場合、データベースの文字セットが使用されますcharset_nameDEFAULT

 警告 

このCONVERT TO操作は、文字セット間で列の値を変換します。これは、1つの文字セット(のような)に列がある場合は必要ありませんlatin1が、格納された値は実際には他の互換性のない文字セット(のようなutf8)を使用します。この場合、そのような列ごとに次のことを行う必要があります。

ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;

これが機能する理由は、BLOB列との間で変換するときに変換が行われないためです。

于 2013-03-19T09:00:26.290 に答える