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

В 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
)
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
170
0
328 161
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

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

Ответ принят как подходящий

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

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

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

Обратите внимание, что семантика длины символа не влияет на максимальную длину 4000 байт для VARCHAR2. Объявление VARCHAR2(4000 CHAR) позволит использовать менее 4000 символов, если некоторые символы требуют хранения нескольких байтов.

Justin Cave 19.07.2012 18:57

@ Дэвид Сайкс. Это семантически то же самое с NVARCHAR (11)?

Nap 06.01.2015 16:50

@Nap Насколько я знаю. Я считаю, что параметр размера в объявлении типа NVARCHAR имеет значение, как в VARCHAR2. то есть, чтобы обеспечить достаточно места для хранения 11 символов (не байтов) в наборе символов NVARCHAR, вы должны сказать NVARCHAR (11 CHAR). ПРИМЕЧАНИЕ: я на самом деле не проверял это. Я никогда не использовал NVARCHAR.

David Sykes 14.01.2015 05:40

Чтобы дополнительно проиллюстрировать разницу между двумя: четыре символа шестнадцатеричного значения (например, «0xFF») или три десятичных символа (например, «255») могут быть «сжаты», когда представлены в виде одного байта: 11111111. Тогда это может быть быть полезным для битовых флагов (до 8 настроек), побитовых операций и т. д.

Matt Borja 08.05.2015 01:51

Обратите внимание, что 1 как символ ASCII (dec. 49) - это 1001001, а 1 как бит - это 00000001.

Matt Borja 08.05.2015 01:57

Если вы определите переменную в PLSQL как VARCHAR2 (11 CHAR), сколько места будет зарезервировано? Учитывая utf8, это должно быть 44 байта, потому что каждый символ может иметь до 4 байтов, и Oracle не имеет возможности заранее узнать, какие символы будут сохранены в переменной.

Roland 25.06.2015 12:08

@Roland Я на самом деле не тестировал это, но полностью ожидаю, что это так. Было бы странно, если бы это не было.

David Sykes 01.07.2015 05:44

@DavidSykes, должен ли я знать, какой символ занимает более одного байта?

151291 24.11.2015 11:11

@ 151291 Насколько я знаю, это зависит от набора символов базы данных. Если база данных настроена на UTF-8, то все, кроме первых 127 символов таблицы ASCII, занимает более 1 байта.

David Sykes 26.11.2015 03:30

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

  1. Ограничивает поле до 11 БАЙТ
  2. Ограничивает поле до 11 СИМВОЛacters


Conclusion: 1 CHAR is not equal to 1 BYTE.

Другие вопросы по теме