В Oracle, в чем разница между:
CREATE TABLE CLIENT
(
NAME VARCHAR2(11 BYTE),
ID_CLIENT NUMBER
)
и
CREATE TABLE CLIENT
(
NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
ID_CLIENT NUMBER
)
Предположим, что набор символов базы данных - UTF-8, который является рекомендуемым параметром в последних версиях Oracle. В этом случае некоторые символы занимают более 1 байта для хранения в базе данных.
Если вы определили поле как VARCHAR2(11 BYTE)
, Oracle может использовать до 11 байтов для хранения, но на самом деле вы не сможете сохранить 11 символов в поле, потому что некоторые из них занимают более одного байта для хранения, например, не английские символы.
Определяя поле, как VARCHAR2(11 CHAR)
вы говорите Oracle, он может использовать достаточно места для хранения 11 символов, независимо от того, сколько байтов требуется для хранения каждого из них. Для одного символа может потребоваться до 4 байтов.
VARCHAR2
. ОбъявлениеVARCHAR2(4000 CHAR)
допускает менее 4000 символов, если для некоторых символов требуется несколько байтов памяти.Один имеет ровно место для 11 байтов, другой - ровно 11 символов. Некоторые наборы символов, такие как варианты Unicode, могут использовать более одного байта на символ, поэтому в 11-байтовом поле может быть место менее 11 символов в зависимости от кодировки.
Смотрите также http://www.joelonsoftware.com/articles/Unicode.html
источник
В зависимости от конфигурации системы размер CHAR в байтах может варьироваться. В ваших примерах:
Вывод: 1 CHAR не равен 1 BYTE.
источник
Я не уверен, так как я не пользователь Oracle, но я предполагаю, что разница заключается в том, что вы используете многобайтовые наборы символов, такие как Unicode (UTF-16/32). В этом случае 11 байтов могут содержать менее 11 символов.
Кроме того, эти типы полей могут обрабатываться по-разному в отношении акцентированных символов или регистра, например, «binaryField (ete) =" été »не будет совпадать, в то время как« charField (ete) = «été» »может (опять же не уверен насчет Oracle) ,
источник