2014-01-30 19 views
1

我試圖從外部.csv插入捷克字符到我的數據庫。Oracle:從外部源插入捷克字符

如果我直接在工作表中打印單詞「Sedláček」的unicode,則獲得「Sedl \ 00E1 \ 010Dek」。但是,如果我打印從.csv導入的相同單詞,我有「Sedl \ 00C3 \ 00A1 \ 00C4 \ 008Dek」,它在我的數據庫「SedlÃÄÄek」中給出。

這是爲什麼不同?我如何從.csv獲得正確的詞彙?

這是我的導入代碼:

set serveroutput on; 

CREATE OR REPLACE DIRECTORY MYREP as '/foo'; 

DECLARE 
    f utl_file.file_type; 
    v_line NVARCHAR2(1000); 

BEGIN 
f := utl_file.fopen ('MYREP', 'toto.csv', 'R'); 
    IF utl_file.is_open(f) THEN 
     LOOP 
      utl_file.get_line(f, v_line, 1000); 
      dbms_output.put_line(ASCIISTR(v_line)); 
     END LOOP; 
    END IF; 
utl_file.fclose(f); 
END; 

,在我的工作表:

set serveroutput on 

BEGIN 
    dbms_output.put_line(ASCIISTR('Sedláček')); 
END; 

您的關注非常感謝!

+2

什麼是您的數據庫字符和國家字符集?如果你正在讀入'nvachar2'變量,是否有這個原因,並且對於你*不使用'fopen_nchar()'和'get_line_nchar()'變種? –

+0

我不知道fopen_nchar()和get_line_nchar()存在!現在,它的工作,我感到很愚蠢= D很多,很多,非常感謝! – Holyheart

回答

3

documentation for UTL_FILE

UTL_FILE預計,UTL_FILE.FOPEN在文本模式下 打開的文件在數據庫中的字符集編碼。它預期在文本模式下打開UTL_FILE.FOPEN_NCHAR的文件 將以UTF8 字符集編碼。如果打開的文件未在預期的 字符集中編碼,則嘗試讀取該文件的結果爲 不確定。

您使用nvarchar2變量表示您需要使用國家字符集,所以你需要使用FOPEN_NCHAR function打開文件,並FOPEN.GET_LINE_NCHAR procedure從中讀出。

BEGIN 
    f := utl_file.fopen_nchar('MYREP', 'toto.csv', 'R'); 
    IF utl_file.is_open(f) THEN 
     LOOP 
      utl_file.get_line_nchar(f, v_line, 1000); 
      dbms_output.put_line(ASCIISTR(v_line)); 
     END LOOP; 
    END IF; 
    utl_file.fclose(f); 
END; 
+0

@Hheheart - ['asciistr'函數](http://docs.oracle.com/cd/E18283_01/server.112/e17118/functions014.htm)'返回數據庫字符集' ,所以這可能與您的數據庫和國家字符集有所不同。你沒有說這些是什麼,但只有你的國家字符集似乎完全支持捷克。如果您使用支持它們的客戶端檢索值(如'nvarchar2'),那麼它們是否正確顯示?我希望如此,但客戶端設置將很重要。不要混淆數據的存儲方式和顯示方式。 –