2011-06-28 15 views
6

Podczas wstawiania ciągów znaków w bazie danych Oracle, niektóre znaki narodowe są zastępowane znakami zapytania, mimo że są one wstawione w kolumnie NCHAR lub NVARCHAR - to powinno być możliwe do obsługi wszystkich znaków Unicode.Wstawianie znaków narodowych do wyroczni NCHAR lub kolumny NVARCHAR nie działa

Dzieje się to przy użyciu programisty SQL firmy Oracle, sqlplus lub przy użyciu sterownika JDBC.

Baza danych NLS_CHARACTERSET jest ustawiona na WE8ISO8859P1 (zachodnioeuropejska iso-8859-1) NLS_NCHAR_CHARACTERSET używana dla kolumn NCHAR jest ustawiona na AL16UTF16. (UTF-16)

Każdy znak spoza NLS_CHARACTERSET wydaje się być zastąpiony odwróconym znakiem zapytania.

+0

mam odpowiedzi na to samo, ponieważ spędziłem tydzień na zastanawianie się, to ... Mam nadzieję, że google znajdzie ... – KarlP

+0

pamiętać, że dobrym sposobem aby obsługiwać UTF8 na Oracle, należy utworzyć bazę danych za pomocą zestawu znaków bazy danych AL32UTF8 i użyć zwykłych kolumn varchar2. – KarlP

Odpowiedz

19

Edycja: Należy zauważyć, że najlepszym sposobem obsługi UTF na Oracle jest utworzenie bazy danych za pomocą zestawu znaków bazy danych AL32UTF8 i użycie zwykłych kolumn varchar2. Jednym z problemów z używaniem kolumn nchar jest to, że oracle nie może używać indeksów dla zwykłych kolumn char/varchar2, gdy argumenty są domyślnie wysyłane jako nchar.

Zresztą: Jeśli nie można przekonwertować bazę danych:


Najpierw literałów Unicode musi być poprzedzone z 'n', jak to:

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

*) 8-bitowe kodowania nie mogą obsłużyć tego tekstu.

Niestety, to za mało.

Z jakiegoś powodu domyślnym zachowaniem dla klientów baz danych jest przetłumaczenie wszystkich literałów łańcuchowych na zestaw znaków bazy danych, , co oznacza, że ​​wartości zostaną zmienione, nawet zanim baza danych zobaczy łańcuch.

Klienci potrzebują konfigurację, aby móc wstawić znak unicode w kolumnę nchar lub nvarchar:

SQL * Plus na Unix

Te zmienne environemnet konfiguruje środowisko UNIX i sqlplus używać plików UTF-8, , a także skonfigurować sqlplus, aby wysyłać literały łańcuchowe w kodzie Unicode.

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

(en_US.UTF-8 dla systemu Solaris. - Linux lub inne systemy mogą wymagać różnych ciągów użyj locale -a do listy obsługiwanych lokalizacji)

JDBC kierowcy

Aplikacje wykorzystujące wyrocznie JDBC sterownik musi mieć następującą właściwość systemową, aby wysyłać ciągi literałów w kodzie Unicode.

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

SQL Developer

Zlokalizuj sqldeveloper.conf, a następnie dodaj następujące linie:

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

SQL Plus Microsoft Windows

nie próbowałem jeśli SQLPLUS w systemie Microsoft Windows lub ropuchy obsługuje UTF-8 w ogóle. Sqlplusw.exe może to zrobić, a następujące ustawienia rejestru mogą załatwić sprawę.

NLS_LANG=AMERICAN_AMERICA.AL32UTF8 
ORA_NCHAR_LITERAL_REPLACE=true 
+0

Czy możesz wyjaśnić, jak to zrobić dla Microsoft SQL Express 2005? – CyprUS

+0

Nie generalnie. Jeśli chodzi o Javę, sterowniki i studio graficzne jdbc działają po wyjęciu z pudełka, jeśli typ kolumny to nchar, a litery są poprzedzone n. – KarlP

+0

Czy wiesz, jak ustawić to dla sterowników .NET System.Data.OracleClient? –

0

Dzięki KarlP - że mnie. Recapowanie tego, co sprawdziło się dla mnie.

Wstawianie chińskiego (dowolnego utf8) tekstu do kolumny nvarchar bazy danych innej niż Unicode (np. ISO8859 itp.), Używając sqlplus na linuxie.

Te parametry db w moim systemie, zauważ jeden bajt kodujący dla znaku, ale wielobajtowy dla nchare. NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET AL16UTF16

np

INSERT INTO tt values (N'气前照灯'); 

'n' poprzedzenie ciąg jest ważne. Ponadto, należy ustawić przed rozpoczęciem env sqlplus,

# 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

To nie jest odpowiedź. Odpowiedź ma na celu pokazać OP rozwiązanie tylko dla jego problemu, ale już istnieje rozwiązanie dobrze pasujące. Twoja odpowiedź jest zbędna i nie należy tutaj. Wiem, że jesteś nowy w Stack Overflow, ale to nie jest sposób, w jaki powszechnie akceptowana jest tutaj odpowiedź. Przepraszam, ale mam nadzieję, że mnie rozumiesz, proszę rozważyć usunięcie swojej odpowiedzi. :-) –