Что означает указанное число в пункте varchar ()?

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

  •  23-09-2019
  •  | 
  •  

Вопрос

Просто чтобы уточнить, указав что -то вроде Varchar (45), означает, что это может занять до максимума 45 символов? Я помню, что несколько лет назад я слышал от кого -то, что число в скобках не относится к количеству персонажей, а затем человек пытался объяснить мне что -то довольно сложное, чего я уже не понимаю и уже забыл.

И в чем разница между Чар и Варчаром? Я немного искал и увидел, что Char дает вам максимум размера столбца, и лучше использовать его, если ваши данные имеют фиксированный размер, и используйте varchar, если варьируется размер данных.

Но если это дает вам максимум размера столбца всех данных этого столбца, разве не лучше использовать его, когда варьируется размер данных? Особенно, если вы не знаете, насколько большим будет ваш размер данных. Varchar должен указать размер (char не нуждается, верно?), Разве это не более хлопотно?

Это было полезно?

Решение

Вы также должны указать размер с CHAR. Анкет С CHAR, значения столбцов сочетаются с пробелами для заполнения указанного вами размера, тогда как с VARCHAR, только фактическое значение, которое вы указали, хранится.

Например:

CREATE TABLE test (
    char_value CHAR(10),
    varchar_value VARCHAR(10)
);

INSERT INTO test VALUES ('a', 'b');

SELECT * FROM test;

Выше выберет "A" для char_value и "B" для varchar_value

Если все ваши значения примерно одинакового размера, CHAR возможно, лучший выбор, потому что он часто требует меньше места для хранения, чем VARCHAR. Анкет Это потому что VARCHAR хранит как длину значения, так и само значение, тогда как CHAR может просто сохранить значение (фиксированного размера).

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

А MySQL документация дает хорошее объяснение требований хранения различных типов данных.

В частности, для цепочки длины l, CHAR(M) DataType займет байты (M XC) (где C - это количество байтов, необходимых для хранения символа ... это зависит от использования символов). А VARCHAR(M) займет (L + 1) или (L + 2) в зависимости от того, является ли M <= 255 или> 255.

Так что это действительно зависит от того, как долго вы ожидаете, что ваши строки будут, какова будет вариация длиной.

NB: документация не обсуждает влияние наборов символов на требованиях хранения VARCHAR тип. Я пытался точно цитировать это, но я предполагаю, что вам нужно будет умножить длину строки на ширину символа, чтобы получить требование хранения.

Char и Varchar на самом деле становятся неактуальными, если в вашей таблице есть только 1 поле с переменной переменной, например, Varchar или Text. MySQL автоматически изменяет все ЧАР на варчар.

Запись о фиксированной длине/размере может дать вам дополнительную производительность, но вы не можете использовать какие -либо типы поля переменной длины. Причина в том, что MySQL будет быстрее и легче найти следующую запись.

Например, если вы выполняете выбор * из ограничения таблицы 10, MySQL должен сканировать файл таблицы на десятой записи. Это означает поиск конца каждой записи, пока вы не найдете конец 10 -й записи. Но если в вашей таблице есть фиксированные записи длины/размера, MySQL просто нужно знать размер записи, а затем пропустить 10 x #bytes.

Если вы знаете, что столбец будет содержать небольшое фиксированное количество ChARS, используя ChAR, в противном случае используйте варчар. Колонна Char пролажена максимальной длиной.

VARCHAR имеет небольшие накладные расходы (4-8 байтов в зависимости от RDBMS), но использует только накладные расходы + фактическое количество хранимых ChARS.

Для значений, которые вы знаете, они будут постоянными, например, для телефонных номеров, почтовых индексов и т. Д., Оптимально использовать «char» наверняка.

Сложные вещи, которые вы не помните, - это то, что 45 относятся к байтам, а не к Chars. Это не то же самое, если вы используете кодирование мультибитного символа. В Oracle вы можете явно указать байты или ChARS.

varchar2(45 BYTE)

или же

varchar2(45 CHAR)

Видеть Разница между байтом и символом в данных столбцов

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