JAVA運転MYSQLのLOADに関する問題まとめ
5409 ワード
MYSQLのLOADがORACLEのCSVファイルをロードする過程で、いくつかの問題に遭遇しました.まとめてみます.
1、文字化けし
私がインストールしたMYSQL設定文字セットはUTF 8ですが、ORACLEからエクスポートしたCSVファイルGBKコードは、JDBCで実行するどころか、NAVICATで実行してもエラーが発生します.
解決方法:まずファイルの文字セットだと判断して、それからLOADのCHARSETを指定します
2、INTタイプの列、データが空のエラー:incorrect integer value
なぜなら、ORACLEでエクスポートされたCSVでは、空の列が「」であり、MYSQLが空の文字として処理(')し、データ変換エラーが発生するためです.
解決方法:
(1).エクスポート時に変換を行い,空であればエクスポートデータは"N"となり,MYSQLが空の値であることを認識する.
(2).NULLIFは変換を行い,先頭のデータが‘であれば空にする.
関連コード:
変更後のLOADスクリプト:
ファイル文字セット判定コード:
参考サイト:
引用I
引用II
1、文字化けし
私がインストールしたMYSQL設定文字セットはUTF 8ですが、ORACLEからエクスポートしたCSVファイルGBKコードは、JDBCで実行するどころか、NAVICATで実行してもエラーが発生します.
解決方法:まずファイルの文字セットだと判断して、それからLOADのCHARSETを指定します
2、INTタイプの列、データが空のエラー:incorrect integer value
なぜなら、ORACLEでエクスポートされたCSVでは、空の列が「」であり、MYSQLが空の文字として処理(')し、データ変換エラーが発生するためです.
解決方法:
(1).エクスポート時に変換を行い,空であればエクスポートデータは"N"となり,MYSQLが空の値であることを認識する.
(2).NULLIFは変換を行い,先頭のデータが‘であれば空にする.
関連コード:
変更後のLOADスクリプト:
load data infile "D:/ftpdir/t_ods_khxxb.csv"
into table t_ods_khxxb
CHARACTER SET GBK
COLUMNS terminated by ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r
'
IGNORE 1 LINES
(@KHBH,@JGBH,@KHXM,@KHXB,@KHZT,@GJ,@ZJLB,@ZJHM,@ZJKSRQ,@ZJJSRQ,@SRRQ,@LXDZ,@JTDH,@SJ,@SFZDZ,@KHRQ,@ZXRQ,@ZYXX,@QYJGXX,@XL,@JJRBH,@JJGXJLRQ)
SET KHBH=nullif(@KHBH,''),JGBH=nullif(@JGBH,''),KHXM=nullif(@KHXM,''),KHXB=nullif(@KHXB,''),KHZT=nullif(@KHZT,''),GJ=nullif(@GJ,''),ZJLB=nullif(@ZJLB,''),ZJHM=nullif(@ZJHM,''),ZJKSRQ=nullif(@ZJKSRQ,''),ZJJSRQ=nullif(@ZJJSRQ,''),SRRQ=nullif(@SRRQ,''),LXDZ=nullif(@LXDZ,''),JTDH=nullif(@JTDH,''),SJ=nullif(@SJ,''),SFZDZ=nullif(@SFZDZ,''),KHRQ=nullif(@KHRQ,''),ZXRQ=nullif(@ZXRQ,''),ZYXX=nullif(@ZYXX,''),QYJGXX=nullif(@QYJGXX,''),XL=nullif(@XL,''),JJRBH=nullif(@JJRBH,''),JJGXJLRQ=nullif(@JJGXJLRQ,'')
ファイル文字セット判定コード:
package csrc.util.tools;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
public class FileEncode {
private File file;
public FileEncode(File file)
{
this.file = file;
}
public FileEncode(String path)
{
file = new File(path);
}
public String getCharset()
{
File file = this.file;
String charset = "GBK";
byte[] first3Bytes = new byte[3];
BufferedInputStream bis = null;
try
{
//boolean checked = false;
bis = new BufferedInputStream(new FileInputStream(file));
bis.mark(0);
int read = bis.read(first3Bytes, 0, 3);
if (read == -1)
{
return charset;
}
if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE)
{
charset = "UTF-16LE";
//checked = true;
}
else if (first3Bytes[0] == (byte) 0xFE
&& first3Bytes[1] == (byte) 0xFF)
{
charset = "UTF-16BE";
//checked = true;
}
else if (first3Bytes[0] == (byte) 0xEF
&& first3Bytes[1] == (byte) 0xBB
&& first3Bytes[2] == (byte) 0xBF)
{
charset = "UTF-8";
//checked = true;
}
/** *//*******************************************************************
* bis.reset(); if (!checked) { int loc = 0; while ((read =
* bis.read()) != -1) { loc++; if (read >= 0xF0) { break; } if (0x80 <=
* read && read <= 0xBF) // BF , GBK { break; } if (0xC0 <=
* read && read <= 0xDF) { read = bis.read(); if (0x80 <= read &&
* read <= 0xBF)// (0xC0 - 0xDF) { // (0x80 - 0xBF), GB
* continue; } else { break; } } else if (0xE0 <= read && read <=
* 0xEF) { // , read = bis.read(); if (0x80 <= read &&
* read <= 0xBF) { read = bis.read(); if (0x80 <= read && read <=
* 0xBF) { charset = "UTF-8"; break; } else { break; } } else {
* break; } } } System.out.println(loc + " " +
* Integer.toHexString(read)); }
******************************************************************/
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (bis != null)
{
try
{
bis.close();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
return charset;
}
public static void main(String[] args)
{
FileEncode fer = new FileEncode("D:/ftpdir/t_ods_yhxxb_UTF.csv");
System.out.println(fer.getCharset());
}
}
参考サイト:
引用I
引用II