Сравнение данных MySQL varchar и IBM DB2 varchar - PullRequest
0 голосов
/ 18 января 2012

У меня небольшое сомнение относительно типа данных MySQL varchar. Как мы все знаем.

char - это тип данных фиксированной длины. Итак, размер хранилища значения char равен максимальный размер для столбца. Но в случае «varchar» это тип данных переменной длины, таким образом, размер хранилища значения varchar - это фактическая длина введенных данных, а не максимальный размер для этого столбца. Вот почему varchar обычно чаще используется, когда необходимо хранить символьно-текстовые данные и сохранять неиспользуемую память для будущего использования.

Недавно я узнал, что ... в случае IBM DB2, если вы используете какой-либо столбец varchar в середине остальных столбцов таблицы, тогда размер хранения символов в этом конкретном столбце равен оригинальный размер столбца varchar.

EX: если в таблице 3 столбца, например:

  1. firstName: char (50)
  2. lastName: varchar (50)
  3. emailId: char (50)

Итак, теперь, если вы хотите сохранить этот текст ('Majhi') в столбце "lastName" с типом данных varchar(50), тогда потребуется полный объем хранения 50char, а не только 5 символов, что является фактическим размером. текущего текста («Маджхи»).

Вот почему в IBM DB2 включение столбцов любого типа данных varchar в середину остальных столбцов таблицы также работает так же, как и тип данных char. Итак, оптимизация памяти не происходит.

Итак, я просто хочу знать, работает ли MySQL таким же образом или он не различает, где когда-либо существует varchar столбец данных и работает соответственно, так как varchar столбец типа данных должен работать.

1 Ответ

2 голосов
/ 18 января 2012

Здесь есть два аспекта.

Первый - хранилище на диске. В этом случае для каждой строки сохраняется столько данных, сколько необходимо, и не важно, есть ли другие столбцы после varchar или нет.

Второй - таблица, загруженная в память. В этом случае MySQL внутренне преобразует VARCHAR(n) в CHAR(m) [1], где m - максимальная длина данных в данном столбце. Поэтому, если ваш столбец объявлен VARCHAR(60), но самая длинная строка, хранящаяся в нем, имеет длину 10, тогда поле в памяти будет иметь фиксированную длину 10. Это приводит к компромиссу между минимизацией объема памяти и максимизацией производительности доступа к данным (легче выбрать конкретный столбец, если вы знаете, где он начинается).

[1]: вид упрощения здесь. На самом деле это не CHAR или любой другой тип данных MySQL.

...