2014-12-04 71 views
3

我目前在oracle中使用了一個數據庫,它有NLS_CHARACTERSET WE8ISO8859P1,所以可以說我在varchar2字段中存儲值是maž(重音字符),所以在數據庫中存儲爲maå¾。現在,當我嘗試使用查詢select * select * from field where fieldValue ='maž'時,它返回0行,然後當我嘗試再次插入時,它給了我一個約束錯誤,說明值已經存在。NLS_CHARACTERSET Oracle中的WE8ISO8859P1和UTF8問題

如何克服這種情況。 我通過Java代碼做這個

+0

_「在數據庫中它被存儲爲maå¾」_你如何得到這個outpout?難道這不是[mojibake](http://en.wikipedia.org/wiki/Mojibake)的例子嗎? – 2014-12-04 14:31:31

+0

你可以試試'ma \ u017E''嗎?爲了排除Java源代碼編碼問題等。您可以嘗試使用通過ID獲取記錄字段的SELECT,以及**轉儲字節/代碼點**。作爲最後的手段,可能需要一個PreparedStatement來填寫該字段。 – 2014-12-04 14:37:46

回答

1

http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch2charset.htm#g1009784

Oracle字符集名稱:WE8ISO8859P1
說明:西歐8位ISO 8859第1個部分
地區:WE(西歐)
用於表示字符的位數:8

另一方面, UTF-8使用幾個字節來存儲一個符號。

如果您的數據庫使用WE8ISO8859P1且列類型來自VARCHAR組(非NVARCHAR),並且您插入的代碼> 255的符號,則此符號將轉換爲WE8ISO8859P1,並且某些信息將丟失。

簡而言之,如果您將UTF-8插入到帶有單字節字符集的數據庫中,您的數據將丟失。

上面的鏈接描述了不同的場景如何解決這個問題。

您也可以嘗試使用Oracle asciistr/unistr函數,但通常不是處理此類問題的好方法。

+0

所以我嘗試了類似於java:String y = new String(x.getBytes(),Charset.forName(「ISO-8859-1」)); \t \t System.out.println(y);它會導致同樣的事情,使用它來做選擇並檢查它是否存在是安全的。 – user958573 2014-12-04 14:50:00

+0

@ user958573它取決於X. UTF8具有更廣泛的代碼範圍,因此如果將不同的符號從UTF8轉換爲ISO-8859-1,則它們在新字符集中可能具有相同的值 – Multisync 2014-12-04 14:56:35

+0

@ user958573但是,如果X fit的所有符號「ISO-8859-1」你可以做到這一點 – Multisync 2014-12-04 14:57:56