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

StackOverflow https://stackoverflow.com/questions/81448

  •  09-06-2019
  •  | 
  •  

Вопрос

В 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, могут использовать более одного байта на символ, поэтому в 11-байтовом поле может быть меньше 11 символов в зависимости от кодировки.

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

В зависимости от конфигурации системы размер символа, измеряемый в БАЙТАХ, может варьироваться.В ваших примерах:

  1. Ограничивает поле значением 11 БАЙТ
  2. Ограничивает поле значением 11 ОБУГЛИВАЮЩИЙСЯдействующие лица


Заключение:1 СИМВОЛ не равен 1 БАЙТУ.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top