В чем разница между VARCHAR и CHAR?


366

В чем разница между VARCHAR и CHAR в MySQL?

Я пытаюсь хранить хеши MD5.


15
Хэш MD5 всегда имеет 32 символа. Поэтому, чтобы максимизировать производительность, используйте CHAR (32), поскольку CHAR имеет фиксированную длину (см. Ответы ниже для более подробной информации о различиях между CHAR и VARCHAR).
Августин

Ответы:


361

VARCHAR переменная длина.

CHAR фиксированная длина.

Если ваш контент имеет фиксированный размер, вы получите лучшую производительность CHAR.

См. Страницу MySQL на типах CHAR и VARCHAR для подробного объяснения (не забудьте также прочитать комментарии).


51
@steven: когда Анон. говорит, что ваш контент имеет фиксированный размер, это означает, что строки вашей таблицы должны содержать все поля фиксированного размера. Вы не получите никакого улучшения производительности, если будете использовать CHAR против VARCHAR в одном поле, но таблица содержит другие поля, которые являются VARCHAR.
Марко Демайо

2
тип данных char не добавляет производительности ... при выполнении запроса sql сгенерирует план выполнения. Предположим, есть 2 столбца charcol char (2000) и VarcharCol Varchar (2000). В плане выполнения предполагаемый размер строки для столбцов типа varchar может быть недооценен. таким образом, это приводит к разливу до температуры дБ. Так что использование char хорошо для производительности
vignesh

1
что означает значение в парантезе VARCHAR (n)?
Сивагами Намби

@ Марко Демайо, ты знаешь причину этого?
Дехан де Кроос

1
@ jdc91: чтобы увеличить производительность, нужно, чтобы вся строка была фиксированной ширины. MySQL получает преимущество в расчете требований к пространству и смещению строк в таблице такого типа.
Марко Демайо

225

CHAR

  1. Используется для хранения значения символьной строки фиксированной длины .
  2. Максимум нет. количество символов, которое может содержать тип данных, составляет 255 символов .
  3. Это на 50% быстрее, чем VARCHAR.
  4. Использует статическое распределение памяти .

VARCHAR

  1. Используется для хранения буквенно-цифровых данных переменной длины .
  2. Максимум, что этот тип данных может содержать до
    • Pre-MySQL 5.0.3: 255 символов .
    • Post-MySQL 5.0.3: 65 535 символов для строки.
  3. Это медленнее, чем CHAR.
  4. Использует динамическое распределение памяти .

3
Я немного удивлен, что за этот ответ проголосовали так часто. Документация MySQL заявляетValues in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
DroidOS

2
не говоря уже о том, что вы можете хранить буквенно-цифровые данные в символьных данных
ninjabber

44
На чем это основано на 50% быстрее? На 50% быстрее что делать? В каких условиях? И что вы подразумеваете под статическим распределением памяти против динамического в этом контексте?
Мартин Смит

4
@MartinSmith Я собирался спросить то же самое .. не думаю, что информация точна. asktom.oracle.com/pls/asktom/….
Ozgur Bar

2
-1; претензии к производительности здесь расплывчаты и необоснованны, разница в стратегии выделения памяти (и почему это важно) не уточняется, а утверждение, что varchar хранит «буквенно-цифровые данные», немного странно; В столбцах varchar могут храниться не буквенно-цифровые символы!
Марк Амери

122

CHAR VARCHAR

CHAR используется для переменной размера фиксированной длины
VARCHAR используется для переменной размера переменной длины.

Например

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

Выход будет

length(City)          Length(street)
10                    6

Вывод: для эффективного использования дискового пространства необходимо использовать VARCHAR вместо CHAR, если переменная длина является переменной


4
Город = символ (10), улица = varchar (10), город = Пуна, улица = Оксфорд, длина (город) = 4, длина (улица) = 6
abdulwadood

2
этот запрос (выберите длину (город), длину (улицу) из temp) дает следующий вывод в mysql 5.7 mysql> выберите длину (город), длину (улицу) из temp; + -------------- + ---------------- + | длина (город) | длина (улица) | + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + 1 строка в наборе (0,00 с)
Джасбер Равал

69

CHAR(x)Колонка может иметь только точно x символы. Столбец может иметь до символов.
VARCHAR(x) x

Поскольку ваши хэши MD5 всегда будут одинакового размера, вам, вероятно, следует использовать CHAR .

Тем не менее, вы не должны использовать MD5 в первую очередь; у него есть известные слабости.
Вместо этого используйте SHA2.
Если вы хэшируете пароли, вы должны использовать bcrypt.


44
Msgstr "Столбец CHAR (x) может содержать только ровно x символов." На самом деле, вы можете добавлять данные с числом символов меньше x, но я думаю, вы имели в виду, что они всегда ЗАПИСЫВАЮТ 10-символьную память за кулисами.
Дан W

13
Вы не знаете, почему они хранят хэши md5, есть много, много веских причин использовать md5, которые не имеют ничего общего с безопасностью. Столкновения не распространены вообще, и алгоритм работает быстрее, чем более безопасные.
Джон Хант

1
Предполагая, что столбец CHAR (x) не обеспечивает строгое соблюдение символов x, есть ли какая-либо причина использовать его над VARCHAR (x) даже для данных фиксированного размера?
NeverEndingQueue

11

В чем разница между VARCHAR и CHAR в MySQL?

К уже приведенным ответам я хотел бы добавить, что в системах OLTP или в системах с частыми обновлениями рекомендуется использовать CHARдаже для столбцов переменного размера из-за возможной VARCHARфрагментации столбцов во время обновлений.

Я пытаюсь хранить хеши MD5.

MD5-хэш не лучший выбор, если безопасность действительно имеет значение. Однако, если вы будете использовать какую-либо хеш-функцию, рассмотрите BINARYвместо нее тип (например, MD5 создаст 16-байтовый хеш, так BINARY(16)что этого будет достаточно вместо CHAR(32)32 символов, представляющих шестнадцатеричные цифры. Это сэкономит больше места и повысит производительность) .


Следуя этой мысли, я бы использовал CHAR для бизнес-идентификаторов, которые предназначены для удобства чтения и эффективности. Я все еще использовал бы первичные ключи bigint все же.
Архимед Траяно

9

Varchar обрезает завершающие пробелы, если введенные символы короче объявленной длины, а char - нет. Char будет заполнять пробелы и всегда будет иметь длину объявленной длины. С точки зрения эффективности, varchar более искусен, так как обрезает символы, чтобы обеспечить большую адаптацию. Однако, если вы знаете точную длину char, char будет выполняться с большей скоростью.


7

В большинстве СУБД сегодня они являются синонимами. Однако для тех систем, у которых все еще есть различие, поле CHAR сохраняется как столбец фиксированной ширины. Если вы определите его как CHAR (10), то в таблицу будет записано 10 символов, где «заполнение» (обычно пробелы) используется для заполнения любого пространства, которое не используются данными. Например, сохранение «bob» будет сохранено как («bob» +7 пробелов). Столбец VARCHAR (переменный символ) предназначен для хранения данных, не тратя впустую дополнительное пространство, которое занимает столбец CHAR.

Как всегда, Википедия говорит громче.


5

CHAR - поле фиксированной длины; VARCHAR - это поле переменной длины. Если вы храните строки с переменной длиной, например, именами, то используйте VARCHAR, если длина всегда одинакова, тогда используйте CHAR, потому что он немного более эффективен по размеру, а также немного быстрее.


Хотя я предполагаю, что утверждения о скорости и эффективности хранилища здесь верны, ни одно из них никоим образом не обосновано (и вполне вероятно, что они ложные), что делает этот ответ бесполезным; это просто повторяет то, что читатель, вероятно, уже ожидал, чтобы быть правдой, не делая ничего, чтобы действительно помочь подтвердить это.
Марк Амери

1

CHAR - фиксированная длина, а VARCHAR - переменная длина. CHAR всегда использует одинаковый объем памяти для каждой записи, тогда как VARCHAR использует только объем, необходимый для хранения фактического текста.


1

Char - это символьный тип данных фиксированной длины, varchar - символьный тип данных переменной длины.

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

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


0

согласно книге High Performance MySQL :

VARCHAR хранит символьные строки переменной длины и является наиболее распространенным типом строковых данных. Для него может потребоваться меньше места для хранения, чем для типов фиксированной длины, поскольку он использует столько места, сколько ему нужно (т. Е. Меньше места используется для хранения более коротких значений). Исключением является таблица MyISAM, созданная с ROW_FORMAT = FIXED, которая использует фиксированный объем пространства на диске для каждой строки и, таким образом, может тратить пространство. VARCHAR помогает производительности, потому что это экономит место.

CHAR фиксированной длины: MySQL всегда выделяет достаточно места для указанного количества символов. При сохранении значения CHAR MySQL удаляет все завершающие пробелы. (Это также относится к VARCHAR в MySQL 4.1 и более ранних версиях - CHAR и VAR CHAR были логически идентичны и отличались только форматом хранения.) Значения дополняются пробелами, необходимыми для сравнения.


2
« VARCHAR помогает производительности, потому что экономит пространство ». Да, экономит пространство, но не влияет ли это на производительность? VARCHARнеобходимо динамически распределять память по мере необходимости, что снижает производительность, а не так CHAR, верно?
Spikatrix

@Spikatrix Зависит. Если значения VARCHAR часто невелики, но могут содержать до N байтов, то динамическое распределение может сэкономить значительный объем пространства и количество операций ввода-вывода, что является более производительным для большого количества данных. Значения CHAR, которые примерно равны по длине, будут более производительными. Читает против пишет также, вероятно, имеет значение.
Андрей

-4

Char имеет фиксированную длину (поддерживает 2000 символов), это символ для типа данных

Varchar имеет переменную длину (поддерживает 4000 символов)


-1; эти цифры не верны для MySQL. (Я думаю, что они могут быть для Oracle?)
Марк Амери

-5

Char или varchar - используется для ввода текстовых данных, длина которых указывается в скобках. Например, имя char (20)


Это не относится к первоначальному вопросу. OP задает вопрос о практических различиях между типами, а не о синтаксисе и назначении типов. Также (и )скобки, а не скобки.
марта

@ 2mac ваше последнее предложение верно только для американского английского; в Англии мы называем (и )скобки, и многие британцы , вероятно, даже не понимают , что есть диалекты английского языка , в котором слово «скобка» может относиться к знак препинания. Есть веские аргументы в пользу того, чтобы предпочитать «круглые скобки» «скобкам» - возможно, в конечном счете, это максимально понятный вариант для целевой аудитории программистов из разных стран - но это более сложный случай, чем «квадратные скобки», которые просто ошибочны.
Марк Амери

-11

CHAR:

  • Поддерживает оба персонажа и номера.
  • Поддерживает 2000 символов.
  • Фиксированная длина.

VARCHAR:

  • Поддерживает оба персонажа и номера.
  • Поддерживает 4000 символов.
  • Переменная длина.

любые комментарии......!!!!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.