Kodowanie znaków

0

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ę.

0

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));
0

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.

0

Jakiego kodowania znaków używa baza do której się łączysz ?

select *  from v$nls_parameters;
0

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?

1

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.