Різниця між BYTE та CHAR у типах даних стовпців


166

У 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
)

Відповіді:


265

Припустимо, набір символів бази даних - UTF-8, що є рекомендованим параметром в останніх версіях Oracle. У цьому випадку деякі символи займають більше 1 байта для зберігання в базі даних.

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

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


55
Зауважте, що семантика довжини символів не впливає на максимальну довжину 4000 байт для a VARCHAR2. Оголошення VARCHAR2(4000 CHAR)дозволить мати менше 4000 символів, якщо для деяких символів потрібно кілька байтів пам’яті.
Джастін Печера

@David Sykes Це семантично те саме з NVARCHAR (11)?
Напад

@Nap Не наскільки я знаю. Я вважаю, що параметр розміру в декларації типу NVARCHAR має значення, як у VARCHAR2. тобто для забезпечення достатнього місця для зберігання 11 символів (не байт) у наборі символів NVARCHAR, ви б сказали, NVARCHAR (11 CHAR). ПРИМІТКА: Я насправді цього не перевіряв. Я ніколи не використовував NVARCHAR.
Девід Сайкс

Щоб додатково проілюструвати різницю між двома: чотири символи кодованого шістнадцятковим значенням (тобто "0xFF") або три десяткових символи (тобто "255") можна "стиснути", якщо представити їх як один байт: 11111111. Це може потім бути корисним для бітових прапорів (до 8 налаштувань), розрядних операцій тощо
Метт Борха

Зауважте, що 1 як символ ASCII (грудень 49) - 1001001, тоді як 1 - трохи 00000001.
Метт Борджа

21

Один має точно простір для 11 байтів, інший - рівно для 11 символів. Деякі діаграми, такі як варіанти Unicode, можуть використовувати більше одного байта на char, тому поле 11 байтів може містити місця менше, ніж 11 символів, залежно від кодування.

Дивіться також http://www.joelonsoftware.com/articles/Unicode.html


17

Залежно від конфігурації системи, розмір CHAR, зафіксованим у BYTES, може змінюватись. У ваших прикладах:

  1. Обмежує поле до 11 BYTE
  2. Обмежує поле до 11 актів CHAR


Висновок: 1 CHAR не дорівнює 1 BYTE.


4

Я не впевнений, оскільки я не є користувачем Oracle, але я припускаю, що різниця полягає в тому, що ви використовуєте багатобайтові набори символів, такі як Unicode (UTF-16/32). У цьому випадку на 11 байт може бути менше 11 символів.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.