2017-01-31 18 views
0

標準のエンコーディングとサーバーエンコーディングをすべてutf8として設定しているMySQLデータベースがあります.jdbcを使用してデータベースにロードする必要がある複数のエンコーディングのcsvファイルがあります。受信ファイルはANSIIをコードである場合でも、LOAD DATA INFILEはcsvキャラクタセット読み込みの問題

java.sql.SQLException: Invalid utf8 character string: '1080' 

私はcsvファイルのヘッダーに基づいて、テーブルtable_abcを作成し、データベースに

LOAD DATA LOCAL INFILE 'XXX.csv' INTO TABLE table_abc CHARACTER SET UTF8 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES 
をcsvファイルをロードするには、以下のクエリを使用していますが失敗しました

は、ここに私のDB定義である私が今何をすべき

character_set_client utf8 
character_set_connection utf8 
character_set_database utf8 
character_set_filesystem binary 
character_set_results utf8 
character_set_server utf8 
character_set_system utf8 
character_sets_dir C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ 

  1. アップロードする前にすべてのファイルをutf8に変換する必要がありますか?複数のエンコードされたファイルに対して複数のエンコードされたテーブルを用意する必要がありますか?はいの場合、Javaで受信ファイルのエンコードを検出するにはどうすればよいですか?私は、テーブルにロード中に非UTF8文字を逃しには問題がない

P.S、私の唯一の意思に関係なくエンコーディングのいずれかのエラーを与えることなく、DB内のファイルの成功でアップロードです。

おかげ

+0

ファイルを読み取るコード、JDBCコード、およびデータベーステーブルの定義が表示されない場合、問題を理解することは困難です。 CSVファイル全体を単一のテキスト値としてアップロードしていますか?バイナリブロブ? – VGR

+0

私は質問を編集しました、それを見てください。 :) – AngryLeo

+0

ファイルのエンコーディングを変更するか、SQLの 'CHARACTER SET'部分を変更するのがベストプラクティスかどうか尋ねていますか? – VGR

答えて

0

あなたには、いくつかの列がUTF8であり、一部の列は、たとえば、latin1のあることを意味するならば、それは少し複雑になるが、それでも可能。

LOADからデータを入れる「ステージング」テーブルを作成します。しかし、VARCHARの列はすべてVARBINARYTEXTとなります。BLOBです。このようにして、データバイトは変更されずにロードされます。その後

そのテーブルには、適切なvarchar型/テキストタイプにバイナリ/ブロブ列を変換するALTER

ALTER ... 
    MODIFY COLUMN col1 VARCHAR(111) CHARACTER SET ... COLLATION ..., 
    MODIFY COLUMN col2 TEXT CHARACTER SET ... COLLATION ..., 
    ...; 

その後(この表が十分でない限り)あなたの「実際の」テーブルに上のデータをコピーします。

カラムにエンコードの混合物がある場合、あなたはSOOLです。文字セット

サンプルまたは列内の英語以外の文字のHEXのうちの2つを提供する特定

。私は通常それが何であるかを知ることができます。 Thisは、16進サンプルからの文字セットを認識する方法のいくつかの手がかりを与えます。

+0

さて...しかし、私はどのように変換する列の文字セットを知っています...私は列のデータの文字セットを意味するのですか? – AngryLeo

+0

私は識別技術へのリンクを追加しました。 –