您可以使用the dump()
function來顯示字符串中的每個字符的數字表示,十進制或十六進制,所以你可以看到非打印字符:
select dump(<some string>) from dual;
你不能直接調用dump
內dbms_output
電話 - 它只能在SQL語句中使用(PLS-00204) - 但你可以把它分配給另一個變量,然後顯示:
declare
...
buffer_dump varchar2(4000);
begin
...
utl_file.get_line(file_handle, buffer);
select dump(buffer) into buffer_dump from dual;
dbms_output.put_line(buffer_dump);
...
既然你處理的是一個CSV文件,它可能是合理的猜測它具有Windows風格的行結束符(CRLF),並且get_line()
在結果中包含回車符,結尾處的額外字符表示爲13
(十進制ASCII)。
declare
buffer varchar2(4000);
buffer_dump varchar2(4000);
begin
buffer := 'Field1,Field2^M'; -- terminated with \r
select dump(buffer) into buffer_dump from dual;
dbms_output.put_line(buffer_dump);
end;
/
Typ=1 Len=14: 70,105,101,108,100,49,44,70,105,101,108,100,50,13
如果這是你可以用replace(<string>, chr(13), '')
,或trim(trailing chr(13) from <string>
,或將其刪除的情況下 - 如你發現自己 - 一個正則表達式。
...
buffer := trim(trailing chr(13) from buffer);
select dump(buffer) into buffer_dump from dual;
dbms_output.put_line(buffer_dump);
...
Typ=1 Len=13: 70,105,101,108,100,49,44,70,105,101,108,100,50
您可以['dump'(http://docs.oracle.com/cd/E11882_01/server.112/e10592/functions055.htm)值,看看它們之間的區別;如果沒有明顯的區別,則很有用。我猜想有一個換行符 - 例如如果該文件是在Windows中創建的。投機雖然很清楚。如果有,那麼你可以用'替換'來剝離它;一個簡單的「trim」不會尋找你擁有的任何角色。 – 2013-02-18 23:37:03
我不是一個大的oracle人,我將如何轉儲值來查看差異。我已經印刷了它們,沒有明顯的差異,並且肯定沒有前導或尾隨空格,不管有沒有被掩蓋。 – user2026989 2013-02-18 23:54:36
這實際上就像一個魅力: – user2026989 2013-02-19 00:07:14