Відповіді:
Припустимо, набір символів бази даних - 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, може змінюватись. У ваших прикладах:
Я не впевнений, оскільки я не є користувачем Oracle, але я припускаю, що різниця полягає в тому, що ви використовуєте багатобайтові набори символів, такі як Unicode (UTF-16/32). У цьому випадку на 11 байт може бути менше 11 символів.
Також ці типи полів можуть трактуватися по-різному стосовно наголошених символів або регістру, наприклад, 'binaryField (ete) = "été"' не збігатиметься, тоді як 'charField (ete) = "été"' може (знову не впевнений у Oracle) .
VARCHAR2
. ОголошенняVARCHAR2(4000 CHAR)
дозволить мати менше 4000 символів, якщо для деяких символів потрібно кілька байтів пам’яті.