Разница между BYTE и CHAR в типах данных столбцов

127

В 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
)
Теги:
unicode
varchar

5 ответов

223
Лучший ответ

Предположим, что набор символов базы данных - это UTF-8, который является рекомендуемым параметром в последних версиях Oracle. В этом случае некоторые символы принимают более 1 байта для хранения в базе данных.

Если вы определяете поле как VARCHAR2(11 BYTE), Oracle может использовать до 11 байтов для хранения, но на самом деле вы не можете хранить 11 символов в поле, потому что некоторые из них берут более одного байта для хранения, например неанглийские символы.

Определив поле как VARCHAR2(11 CHAR), вы сообщите Oracle, что он может использовать достаточно места для хранения 11 символов, независимо от того, сколько байтов требуется для их хранения. Для одного символа может потребоваться до 4 байтов.

  • 51
    Обратите внимание, что семантика длины символа не влияет на максимальную длину 4000 байтов для VARCHAR2 . Объявление VARCHAR2(4000 CHAR) позволит использовать менее 4000 символов, если для некоторых символов требуется несколько байтов памяти.
  • 0
    @ Дэвид Сайкс Это семантически то же самое с NVARCHAR (11)?
Показать ещё 7 комментариев
19

У одного есть ровно пространство для 11 байтов, другое - ровно 11 символов. Некоторые кодировки, такие как Unicode-варианты, могут использовать более одного байта на char, поэтому для 11-байтового поля может быть место для менее 11 символов в зависимости от кодировки.

См. также http://www.joelonsoftware.com/articles/Unicode.html

15

В зависимости от конфигурации системы размер CHAR, измеренный в BYTES, может меняться. В ваших примерах:

  • Ограничивает поле до 11 BYTE
  • Ограничивает поле до 11 CHAR актеров

<ч/" > Вывод: 1 CHAR не равен 1 BYTE.

3

Я не уверен, так как я не являюсь пользователем Oracle, но я предполагаю, что разница заключается в использовании многобайтовых наборов символов, таких как Unicode (UTF-16/32). В этом случае 11 байтов могут составлять менее 11 символов.

Также эти типы полей могут обрабатываться по-разному в отношении акцентированных символов или случая, например: 'binaryField (ete) = "été" ' не будет совпадать, пока 'charField (ete) = "été" ' может (опять же не уверен об Oracle).

0

какая версия оракула? В общем, персонаж может принимать более одного байта, Google для юникода. Здесь начинается:

http://www.oracle.com/technology/oramag/oracle/03-nov/o63tech_glob.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню