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スクリプト:
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