Неподдерживаемые символы в базе данных Oracle - PullRequest
0 голосов
/ 29 февраля 2020

Я хочу, чтобы кто-то объяснил мне, почему неподдерживаемые символы могут храниться в базе данных 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

enter image description here

И это верно, если Win1251 (кириллица c) устанавливается как свойство «Удаленный набор символов» в клиенте Kitty s sh.

enter image description here

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

enter image description here

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 в этом случае?

...