Witam wszystkim. Mam problem odnośnie kodowania znaków. Mianowicie chodzi o dodanie rekordu do tabeli, gdzie np. ustawiamy typ danych VARCHAR2(2) i wpisujemy za pomocą INSERT ('ść'). W Oracle SQL Developerze jest wszystko w porządku, bo zadeklarowaliśmy ciąg znaków w ilości 2 i taką też wpisaliśmy, natomiast na stronie sqlfiddle mamy błąd, ponieważ przekroczono liczbę znaków (actual: 4, maximum: 2). Czy może to mieć związek z NLS_CHARACTERSET = EE8MSWIN1250 bo taki mam ustawiony w SQL Developerze. Czy też jest tego inna przyczyna? Życzę miłego dnia i dziękuję.
W Oracle określając typ danych tekstowych masz możliwość wskazania czy rozmiar wyrażony jest w bajtach, czy w znakach.
Różnica jest taka, że znak może być zakodowany na wielu bajtach.
Podejrzewam, że na stronie znaki kodowane są w UTF-8 i przekazywane do bazy tak jak zostały wpisane.
create table foo (a varchar2(2 byte), b varchar2(2 char));
insert into foo (a) values ('ś');
insert into foo (b) values ('ść');
Po utworzeniu schematu na sqlfiddle możesz to zweryfikować:
select * from v$nls_parameters;
NLS_CHARACTERSET -> AL32UTF8
NLS_LENGTH_SEMANTICS -> BYTE
Tworząc schemat określ semantykę jako CHAR:
create table foo (pole varchar2(2 char));
Super, dziękuję bardzo. Ja nie chcę niczego zmieniać w zasadzie, a chciałbym się dowiedzieć skąd to się bierze tak na prawdę. Chodzi o to, że gdy utworzę tabelę np.
create table nazwa (kolumna varchar2(2));
To wówczas przy wprowadzaniu danych do tej tabeli np.
insert into nazwa values ('ść');
To w SQL Developerze nie przekroczę zadeklarowanej długości znaków ze względu na NLS_CHARACTERSET = EE8MSWIN1250 tak?
Natomiast na tej stronie, którą podałem jest błąd ze względu na NLS_CHARACTERSET -> AL32UTF8 bo tak znaki kodowane są najprawdopodobniej w UTF-8?
Pozdrawiam.
Jakiego kodowania znaków używa baza do której się łączysz ?
select * from v$nls_parameters;
Tutaj wszystkie parametry:
NLS_LANGUAGE POLISH
NLS_TERRITORY POLAND
NLS_CURRENCY zł
NLS_ISO_CURRENCY POLAND
NLS_NUMERIC_CHARACTERS ,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT RR/MM/DD
NLS_DATE_LANGUAGE POLISH
NLS_CHARACTERSET EE8MSWIN1250
NLS_SORT POLISH
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT RR/MM/DD HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT RR/MM/DD HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY zł
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
Chodzi o to > NLS_CHARACTERSET -> EE8MSWIN1250 tak?
Natomiast na tamtej stronie napisał Pan, że jest >NLS_CHARACTERSET -> AL32UTF8 dobrze zrozumiałem?
Po pierwsze nie pan, a po drugie, to właśnie powód dla którego baza na sqlfiddle na 2 bajtach nie jest w stanie zmieścić 2 znaków, a baza do której się łączysz już tak.
EE8MSWIN1250 -> na 1 bajcie składowany jest 1 znak.
AL32UTF8 -> jest w stanie pomieścić dużo więcej znaków, ale potrzebuje do realizacji tego zadania więcej niż 1 bajta.
Jęśli tworzysz tabelę tak:
create table foo (a varchar2(2));
To dla Oracle jest to informacja, żeby utworzyć atrybut "a", który pomieści 2 i albo bajty albo 2 znaki. Semantyka długości pola tekstowego (bajt czy znak) jest parametrem konfiguracyjnym bazy.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.