Разница между VARCHAR2 (10 CHAR) и NVARCHAR2 (10)

Я установил Oracle Database 10g Express Edition (Universal) с настройками по умолчанию:

SELECT * FROM NLS_DATABASE_PARAMETERS;

NLS_CHARACTERSET               AL32UTF8                                 
NLS_NCHAR_CHARACTERSET         AL16UTF16                                

учитывая, что оба CHAR и NCHAR типы данных, похоже, принимают многобайтовые строки, в чем точная разница между этими двумя определениями столбцов?

VARCHAR2(10 CHAR)
NVARCHAR2(10)

3 ответов


на NVARCHAR2 тип данных был введен Oracle для баз данных, которые хотят использовать Unicode для некоторых столбцов, сохраняя другой набор символов для остальной части базы данных (которая использует VARCHAR2). NVARCHAR2-это тип данных только для Юникода.

одной из причин, по которой вы можете использовать NVARCHAR2, может быть то, что ваша БД использует набор символов, отличный от Unicode, и вы все равно хотите иметь возможность хранить данные Unicode для некоторых столбцов без изменения основного набора символов. Другой причина может заключаться в том, что вы хотите использовать два набора символов Юникода (AL32UTF8 для данных, поступающих в основном из Западной Европы, AL16UTF16 для данных, поступающих в основном из Азии, например), потому что разные наборы символов не будут одинаково эффективно хранить одни и те же данные.

оба столбца в вашем примере (Unicode VARCHAR2(10 CHAR) и NVARCHAR2(10)) сможет хранить одни и те же данные, однако байтовое хранилище будет отличаться. Некоторые строки могут храниться более эффективно в одной или другой.

обратите внимание также, что некоторые функции не будут работать с NVARCHAR2, см. Этот вопрос SO:


nVarchar2 - это Юникод-только хранения.

хотя оба типа данных являются строковыми типами данных переменной длины, вы можете заметить разницу в том, как они хранят значения. Каждый символ хранится в байтах. Как мы знаем, не все языки имеют алфавиты одинаковой длины, например, английский алфавит нуждается в 1 байт на символ, однако, языки, такие как японский или китайский, нуждаются в более чем 1 байт для хранения символа.

при указании varchar2(10), вы говорите БД, что только 10 байт данных будут сохранены. Но, когда вы говорите nVarchar2(10), это значит 10 символов будут сохранены. В этом случае вам не нужно беспокоиться о количестве байтов, которое занимает каждый символ.


интересно, если NVARCHAR2(1) и VARCHAR2(1) действуют по-разному в отношении нулевого / пустого значения?

из тестирования, кажется, то же самое ..

может получить некоторые сюрпризы

т. е. сравнение пустой строки с != 'Y' не вернет пустые строки строки .. т. е. пустая строка ни делает, ни не равна "Y"...

нужна функция оболочки nvl
например. и nvl (верхний (WP."OW_IS_MISRUN"), 'N')!= 'Y'

выберите рассчитывать(*) от "DATA_HUB"."OW_WELL_PERFORATION" WP где WP.UWI = 17038046

7

выберите количество(*) от "DATA_HUB"."OW_WELL_PERFORATION" WP где WP.UWI = 17038046 и верхний (WP."OW_IS_MISRUN") != 'Y'

1

выберите количество(*) от "DATA_HUB"."OW_WELL_PERFORATION" WP где WP.UWI = 17038046 и верхний (WP."OW_IS_MISRUN") = 'Y'

2

выберите количество(*) от "DATA_HUB"."OW_WELL_PERFORATION" WP где WP.UWI = 17038046 и nvl (верхний (WP."OW_IS_MISRUN"), 'N')!= 'Y'

5