2015-06-22 59 views
1

我有一個通過Web服務獲取數據的程序,其中一些數據似乎是一個格式問題。在Oracle中處理¿

例如,我獲取「XYZ¿ABC」等數據。

問題是我期待收到的數據長度定義爲VARCHAR2(9 BYTE)。

在我的Java程序中,我可以看到數據的長度是9,但在嘗試在Oracle端插入數據時,我得到一個字段長度不匹配錯誤(其中Oracle將它視爲10)。

我改變了我的程序讀取在ANSI格式的數據很好,但問題依然存在。

請告知,如果有一些改變,我應該讓我的程序來處理這個(想法之一是在Oracle端使用子字符串,並將傳入的數據限制爲9字節,但我不想這樣做,因爲在這種情況下我可能會丟失一些數據)

關心。

+0

''¿'通常表示字符集轉換問題。什麼是你想要處理的正確的字符串? Oracle數據庫中的字符集是什麼? – sstan

+1

該數據的長度是9個字符,但字節數取決於編碼。在UTF-8中,它是10個字節。您應該決定是否要在插入之前更改字段的定義或清理數據。 – RealSkeptic

+0

''是一個字符的地方持有人,不能存儲在您的數據庫或您的客戶端無法存儲。你的數據庫字符集是什麼,你期望輸出什麼? –

回答

1

雖然「XYZ ABC」爲9 個字符,但它不是9個字節。這是因爲¿是UTF-8中的多字節字符。

Oracle有two solutions用於在數據庫中啓用unicode,但是在這裏發佈整個東西作爲答案太長。

+0

沒有「¿」表示任何「不可顯示」的字符。在很多情況下,它將是一個多字節字符,但它不是強制性的。 –

1

有兩件事情可能發生。一個是有損壓縮。在這種情況下,您將一個壞字符保存在數據庫中,並且無法「格式化」回來,因爲所有這些字符都被錯誤地縮減爲相同的代碼。在這種情況下,你可以看到數據被保存爲與原始代碼:

select DUMP('your string') from dual 

第二種情況,是有隻是字符集之間的不匹配。

對於這兩個問題,您需要確保您傳遞的所有數據都使用相同的字符集進行編碼。 UTF-8是一個普遍支持的。如果你沒有任何非美國人的字符,ASCII是最好的。

要查看的內容:

java使用什麼字符集? Oracle將數據保存爲什麼字符集? 您的驅動程序支持哪些字符集?

0

該問題已通過將數據類型更改爲9個字符解決。