В 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 байтов.
У одного есть ровно пространство для 11 байтов, другое - ровно 11 символов. Некоторые кодировки, такие как Unicode-варианты, могут использовать более одного байта на char, поэтому для 11-байтового поля может быть место для менее 11 символов в зависимости от кодировки.
См. также http://www.joelonsoftware.com/articles/Unicode.html
В зависимости от конфигурации системы размер CHAR, измеренный в BYTES, может меняться. В ваших примерах:
<ч/" > Вывод: 1 CHAR не равен 1 BYTE.
Я не уверен, так как я не являюсь пользователем Oracle, но я предполагаю, что разница заключается в использовании многобайтовых наборов символов, таких как Unicode (UTF-16/32). В этом случае 11 байтов могут составлять менее 11 символов.
Также эти типы полей могут обрабатываться по-разному в отношении акцентированных символов или случая, например: 'binaryField (ete) = "été" ' не будет совпадать, пока 'charField (ete) = "été" ' может (опять же не уверен об Oracle).
какая версия оракула? В общем, персонаж может принимать более одного байта, Google для юникода. Здесь начинается:
http://www.oracle.com/technology/oramag/oracle/03-nov/o63tech_glob.html