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も試しましたが、役に立ちませんでした。
どんな洞察も大歓迎です
解決策を見つけたので、これに答えるつもりです。私はJavaを使用してLOAD DATA INFILE
JDBCを介して、JDBCドライバーは、ファイルを解析するときにロードされる実際のテーブルではなく、DBで照合をチェックしているようです。したがって、INSERT
ステートメントで実行できるように、DBをUTF-8に設定してラテン語の照合テーブルを作成することはできません。私はテーブル照合をラテン語に設定しようとしましたが、問題のフィールドもラテン語でしたが、DB全体をラテン語に変更するまでは失敗していました。 CSVファイルは大きいので、問題のすべての文字をチェックするのは簡単ではありませんが、Javaで例外をキャッチしていて、エラーがJDBCドライバーによって生成されていて、不平を言っていました。 「xx行目の文字はUTF-8文字ではありません」デバッグで実行すると、詳細を確認できました。
次に、ラテン語の照合されたテーブルではなく、UTF-8に設定されているDBを調べていると結論付けました。 DBをラテン語に変更するだけで済みました。
@Rick Jamesの助力に感謝します。これが将来他の人の役に立つことを願っています。
パット