В 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
)
В 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 символов, если для некоторых символов требуется несколько байтов памяти.
- person Justin Cave; 19.07.2012
utf8
Это должно быть 44 байта, потому что каждый символ может иметь до 4 байтов, и Oracle не имеет возможности заранее узнать, какие символы будут сохранены в переменной.
- person Roland; 25.06.2015
В одном месте ровно 11 байтов, в другом - ровно 11 символов. Некоторые наборы символов, такие как варианты Unicode, могут использовать более одного байта на символ, поэтому в 11-байтовом поле может быть меньше 11 символов в зависимости от кодировки.
См. Также http://www.joelonsoftware.com/articles/Unicode.html.
В зависимости от конфигурации системы размер CHAR, измеренный в БАЙТАХ, может варьироваться. В ваших примерах:
Я не уверен, поскольку я не являюсь пользователем Oracle, но предполагаю, что разница заключается в том, что вы используете многобайтовые наборы символов, такие как Unicode (UTF-16/32). В этом случае 11 байтов могут составлять менее 11 символов.
Также эти типы полей могут обрабатываться по-разному в отношении акцентированных символов или регистра, например, 'binaryField (ete) = "été"' не будет соответствовать, а 'charField (ete) = "été"' может (снова не уверен в Oracle) .
Проще говоря, когда вы пишете NAME VARCHAR2(11 BYTE)
, в этой переменной можно разместить только 11 байтов.
Независимо от того, какой набор символов вы используете, например, если вы используете Unicode (UTF-16), тогда только половина размера Name может быть размещена в NAME
.
С другой стороны, если вы напишете NAME VARCHAR2(11 CHAR)
, тогда NAME
может вместить 11 символов независимо от их кодировки символов.
BYTE
используется по умолчанию, если вы не укажете BYTE
или CHAR
Таким образом, если вы пишете NAME VARCHAR2(4000 BYTE)
и используете кодировку символов Unicode (UTF-16), то в NAME
можно разместить только 2000 символов.
Это означает, что ограничение размера переменной применяется в BYTES
, и зависит от кодировки символов, сколько символов может быть помещено в этот vraible.