2014-12-01 2 views
1
select rawtohex(UNISTR('\0436')) from dual 

возвращает 0436Oracle изменяет кодирующий

update my_table set my_column = UNISTR('\0436') where id = 248149; 
SELECT rawtohex(my_column) from my_table where id = 248149; 

возвращает E6

поэтому я ставлю символ в UTF8 и получить его обратно в CP1251. Почему так?

+0

Какая у вас кодировка базы данных? Может ли он на самом деле хранить широкие символы? NLS_CHARACTERSET. Если нет, вы можете переустановить или использовать столбец NVARCHAR/NCLOB. – eckes

ответ

0

Вы сохраняете строку unicode в колонке varchar2. Рассмотрите возможность сохранения их в столбцах типа nvarchar2.

create table my_table 
(
id number(10), 
my_column varchar2(100), 
my_column_uni nvarchar2(100) 
); 

insert into my_table values(1, UNISTR('\0436'), UNISTR('\0436')); 
commit; 

select rawtohex(my_column), rawtohex(my_column_uni) 
    from my_table 
where id = 1; 

Вывод будет E6 для столбца varchar2 и 0436 для NVARCHAR2 колонны. Oracle изменяет кодировку на основе вашего nls parameters, где у вас есть параметры NLS_CHARACTERSET и NLS_NCHAR_CHARACTERSET NLS. Вы можете запросить свои конкретные параметры.

select * 
from nls_database_parameters 
Смежные вопросы