2011-06-28 67 views
6

在Oracle數據庫中插入字符串時,即使將某些國家字符插入到NCHAR或NVARCHAR列中,它們也會被替換爲問號 - 應該可以處理所有的Unicode字符。將國家字符插入到Oracle NCHAR或NVARCHAR列中不起作用

這發生在使用Oracle的SQL Developer,sqlplus或使用JDBC驅動程序。

數據庫NLS_CHARACTERSET設置爲WE8ISO8859P1(西歐iso-8859-1) 用於NCHAR列的NLS_NCHAR_CHARACTERSET設置爲AL16UTF16。 (UTF-16)

不在NLS_CHARACTERSET中的任何字符似乎都被替換爲倒​​置問號。

+0

我自己回答這個問題,因爲我已經花了一個星期搞清楚了這一點。我希望谷歌認爲它... – KarlP

+0

注意的好辦法在Oracle上支持UTF8,就是使用數據庫字符集AL32UTF8創建數據庫,並使用普通的varchar2列。 – KarlP

回答

19

編輯:請注意,在Oracle上處理UTF的最佳方法是使用數據庫字符集AL32UTF8創建數據庫,並使用普通的varchar2列。使用nchar列的問題之一是,默認情況下,當參數作爲nchar發送時,oracle不能使用普通char/varchar2列的索引。

總之:如果你不能將數據庫轉換:


首先,統一文字,需要使用一個 'N' 爲前綴,像這樣:

select n'Language - Språk - Język' from dual; 

*) 8位編碼無法處理此文本

不幸的是,這還不夠。

由於某些原因,數據庫客戶端的默認行爲是將所有字符串文本轉換爲數據庫字符集,即數據庫查看字符串之前即會更改值。

的客戶需要以一些配置能夠插入Unicode字符爲NCHAR或nvarchar列:

SQL加上Unix的

這些environemnet變量設置UNIX環境和SQLPLUS要使用UTF-8文件, 並且還要配置sqlplus以unicode發送字符串文字。

NLS_LANG=AMERICAN_AMERICA.AL32UTF8 
LC_CTYPE="en_US.UTF-8" 
ORA_NCHAR_LITERAL_REPLACE=true 

(是en_US.UTF-8是用於Solaris - Linux或其他系統可能需要不同的字符串,用locale -a列出支持的語言環境)

JDBC驅動程序使用甲骨文JDBC

應用驅動程序需要定義以下系統屬性以在unicode中發送字符串文字。

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.convertNcharLiterals=true 

SQL開發

找到的SQLDeveloper。CONF,並添加以下行:

AddVMOption -Doracle.jdbc.defaultNChar=true 
AddVMOption -Doracle.jdbc.convertNcharLiterals=true 

SQL加在Microsoft Windows

如果sqlplus中在Microsoft Windows或蟾蜍處理UTF-8在所有我還沒有試過。 Sqlplusw.exe可能會這樣做,並且以下注冊表設置可能會有所斬獲。

NLS_LANG=AMERICAN_AMERICA.AL32UTF8 
ORA_NCHAR_LITERAL_REPLACE=true 
+0

你能解釋如何爲Microsoft SQL Express 2005做到這一點嗎? – CyprUS

+0

不一般。關於Java,如果列類型是nc​​har並且文字前綴爲n,那麼jdbc驅動程序和visual studio就開箱即用了。 – KarlP

+0

您是否知道如何爲.NET System.Data.OracleClient驅動程序設置此值? –

0

謝謝KarlP--讓我走了。改變對我有用的東西。

在linux上使用sqlplus將中文(任何utf8)文本插入非Unicode數據庫(例如:ISO8859等)的nvarchar列。

這些db params在我的系統上,注意單字節編碼char,但多字節nchare。 NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET AL16UTF16

例如:

INSERT INTO tt values (N'氣前照燈'); 

的 'N' 前面加上字符串是重要的。 此外,必須在啓動sqlplus的前設置ENV,

# Important to tell sqldeveloper what encoding is needed. 
export NLS_LANG=AMERICAN_AMERICA.UTF8 
# Others might find AMERICAN_AMERICA.AL32UTF8 or whatever better suits. 

# ** THIS MATTERS - DOES NOT WORK WITHOUT !! 
export ORA_NCHAR_LITERAL_REPLACE=true 
+0

這不是一個答案應該如何。一個答案應該表明OP爲他的問題提供了一個解決方案,但它已經存在一個很好的解決方案。你的答案是多餘的,不屬於這裏。我知道你是Stack Overflow的新手,但這不是一個普遍接受的答案。對不起,但我希望你理解我,請考慮刪除你的答案。 :-) –

相關問題