web-dev-qa-db-ja.com

UTF8 Unicode照合とLOAD DATA INFILEを使用したMySQLの特殊文字

Javaを使用してMySQlにロードしているcsvファイルがいくつかあります。 「説明」フィールドに、ロードが失敗する原因となっているいくつかの特殊文字があります。 LOAD DATA INFILEを使用しています。これは、ファイル名/テーブルの配列を解析し、すべてのファイルが終了するまで各組み合わせを実行するfor eachループにネストされます。

これは、jdbc接続文字列で、UTF8照合の最終的な照合パラメータ/値を渡します。

 static String  url = "jdbc:mysql://localhost:3306/stage?verifyServerCertificate=false&characterEncoding=UTF8";

これが私のLOAD DATA文字列です。

final String sql2 = ("LOAD DATA INFILE" + filetoEat  +
       "INTO TABLE staging." +tableName +
       "CHARACTER SET UTF8
       FIELDS TERMINATED BY','  ENCLOSED BY '\"\'
       LINES TERMINATED BY '\n'  IGNORE 1 LINES");

テーブルステートメントの作成

CREATE TABLE `zmi064_02` (
  `Material` varchar(11) CHARACTER SET utf8 DEFAULT NULL,
  `Material Description` varchar(60) CHARACTER SET utf8 DEFAULT NULL,
  `MatType` text CHARACTER SET utf8,
  `MatGrp` text CHARACTER SET utf8,
  `ClassType` text CHARACTER SET utf8,
  `Class type Text` text CHARACTER SET utf8,
  `Class` text CHARACTER SET utf8,
  `Class Text` text CHARACTER SET utf8,
  `CharactName` text CHARACTER SET utf8,
  `CharactValue` text CHARACTER SET utf8,
  `Plant` varchar(6) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

変数を表示

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
collation_connection        utf8_general_ci
collation_database          utf8_unicode_ci
collation_server            utf8_general_ci

Material Description内の度数記号やマイクロ記号µなどの特殊文字に遭遇するまで、コードは正常に機能しています。その時点で例外がスローされます

Invalid utf8 character string: 'LUG'

文字列LUGの後にµ記号が続きます。 DBはutf8-utf8_unicode_ciに設定されており、問題の列は資料の説明を保持するVARCHAR(60)です。 ESCAPED BY '\'を使用しようとしましたが、正しく機能していないようです。 CHARACTER SET UTF8も試しました。また、別の照合、つまりutf8_general_ciも試しましたが、役に立ちませんでした。

どんな洞察も大歓迎です

4
apesa

解決策を見つけたので、これに答えるつもりです。私はJavaを使用してLOAD DATA INFILE JDBCを介して、JDBCドライバーは、ファイルを解析するときにロードされる実際のテーブルではなく、DBで照合をチェックしているようです。したがって、INSERTステートメントで実行できるように、DBをUTF-8に設定してラテン語の照合テーブルを作成することはできません。私はテーブル照合をラテン語に設定しようとしましたが、問題のフィールドもラテン語でしたが、DB全体をラテン語に変更するまでは失敗していました。 CSVファイルは大きいので、問題のすべての文字をチェックするのは簡単ではありませんが、Javaで例外をキャッチしていて、エラーがJDBCドライバーによって生成されていて、不平を言っていました。 「xx行目の文字はUTF-8文字ではありません」デバッグで実行すると、詳細を確認できました。

次に、ラテン語の照合されたテーブルではなく、UTF-8に設定されているDBを調べていると結論付けました。 DBをラテン語に変更するだけで済みました。

@Rick Jamesの助力に感謝します。これが将来他の人の役に立つことを願っています。

パット

1
apesa