Я хочу, чтобы кто-то объяснил мне, почему неподдерживаемые символы могут храниться в базе данных Oracle.
Например, у меня есть база данных oracle 10.2.0.5 (очень старая версия, но она не вопрос), который был создан с помощью CL8MSWIN1251 набора символов
set pages 999
set lines 300
col PARAMETER for a30
col VALUE for a30
select * from v$nls_parameters where PARAMETER in ('NLS_CHARACTERSET' , 'NLS_NCHAR_CHARACTERSET');
PARAMETER VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET CL8MSWIN1251
NLS_NCHAR_CHARACTERSET AL16UTF16
oracle@localhost|15:32|~:<WIN1251>echo $NLS_LANG
AMERICAN_AMERICA.CL8MSWIN1251
oracle@localhost|15:41|~:<WIN1251>echo $LC_ALL
en_US.UTF-8
В соответствии с документом Какой набор символов поддерживает какой язык (Do c ID 62421.1) символ Набор поддерживает только кириллицу c и английский sh
И это верно, если Win1251 (кириллица c) устанавливается как свойство «Удаленный набор символов» в клиенте Kitty s sh.
create table table1251 (col1 varchar2(50));
insert into table1251(col1) values('Русский');
insert into table1251(col1) values('հայերեն');
insert into table1251(col1) values('日本語');
insert into table1251(col1) values('中國人');
commit;
SQL> select * from table1251;
COL1
--------------------------------------------------
Русский
.......
...
...
Но когда UTF-8 устанавливается в клиенте Kitty s sh. Становится возможным вставлять также символы не-кириллицы c
create table table1251 (col1 varchar2(50));
insert into table1251(col1) values('Русский');
insert into table1251(col1) values('հայերեն');
insert into table1251(col1) values('日本語');
insert into table1251(col1) values('中國人');
commit;
SQL> select * from table1251;
COL1
--------------------------------------------------
Русский
հայերեն
日本語
中國人
Так почему это возможно? Почему CL8MSWIN1251 может хранить не-кириллические символы c в этом случае?