

В одном месте ровно 11 байтов, в другом - ровно 11 символов. Некоторые наборы символов, такие как варианты Unicode, могут использовать более одного байта на символ, поэтому в 11-байтовом поле может быть меньше 11 символов в зависимости от кодировки.
См. Также http://www.joelonsoftware.com/articles/Unicode.html
Я не уверен, поскольку я не являюсь пользователем Oracle, но предполагаю, что разница заключается в том, что вы используете многобайтовые наборы символов, такие как Unicode (UTF-16/32). В этом случае 11 байтов могут составлять менее 11 символов.
Также эти типы полей могут обрабатываться по-разному в отношении акцентированных символов или регистра, например, 'binaryField (ete) = "été"' не будет соответствовать, а 'charField (ete) = "été"' может (опять же не уверен в Oracle) .
Предположим, что набор символов базы данных - UTF-8, что является рекомендуемой настройкой в последних версиях Oracle. В этом случае для хранения некоторых символов в базе данных требуется более 1 байта.
Если вы определяете поле как VARCHAR2(11 BYTE), Oracle может использовать до 11 байтов для хранения, но вы, возможно, не сможете сохранить 11 символов в поле, потому что некоторые из них требуют для хранения более одного байта, например неанглийские символы.
Определяя поле как VARCHAR2(11 CHAR), вы сообщаете Oracle, что он может использовать достаточно места для хранения 11 символов, независимо от того, сколько байтов требуется для хранения каждого из них. Для одного символа может потребоваться до 4 байтов.
@ Дэвид Сайкс. Это семантически то же самое с NVARCHAR (11)?
@Nap Насколько я знаю. Я считаю, что параметр размера в объявлении типа NVARCHAR имеет значение, как в VARCHAR2. то есть, чтобы обеспечить достаточно места для хранения 11 символов (не байтов) в наборе символов NVARCHAR, вы должны сказать NVARCHAR (11 CHAR). ПРИМЕЧАНИЕ: я на самом деле не проверял это. Я никогда не использовал NVARCHAR.
Чтобы дополнительно проиллюстрировать разницу между двумя: четыре символа шестнадцатеричного значения (например, «0xFF») или три десятичных символа (например, «255») могут быть «сжаты», когда представлены в виде одного байта: 11111111. Тогда это может быть быть полезным для битовых флагов (до 8 настроек), побитовых операций и т. д.
Обратите внимание, что 1 как символ ASCII (dec. 49) - это 1001001, а 1 как бит - это 00000001.
Если вы определите переменную в PLSQL как VARCHAR2 (11 CHAR), сколько места будет зарезервировано? Учитывая utf8, это должно быть 44 байта, потому что каждый символ может иметь до 4 байтов, и Oracle не имеет возможности заранее узнать, какие символы будут сохранены в переменной.
@Roland Я на самом деле не тестировал это, но полностью ожидаю, что это так. Было бы странно, если бы это не было.
@DavidSykes, должен ли я знать, какой символ занимает более одного байта?
@ 151291 Насколько я знаю, это зависит от набора символов базы данных. Если база данных настроена на UTF-8, то все, кроме первых 127 символов таблицы ASCII, занимает более 1 байта.
В зависимости от конфигурации системы размер CHAR, измеренный в БАЙТАХ, может варьироваться. В ваших примерах:
Обратите внимание, что семантика длины символа не влияет на максимальную длину 4000 байт для
VARCHAR2. ОбъявлениеVARCHAR2(4000 CHAR)позволит использовать менее 4000 символов, если некоторые символы требуют хранения нескольких байтов.