В чем разница между VARCHAR и CHAR в MySQL?
Я пытаюсь хранить хеши MD5.
В чем разница между VARCHAR и CHAR в MySQL?
Я пытаюсь хранить хеши MD5.
Ответы:
VARCHAR
переменная длина.
CHAR
фиксированная длина.
Если ваш контент имеет фиксированный размер, вы получите лучшую производительность CHAR
.
См. Страницу MySQL на типах CHAR и VARCHAR для подробного объяснения (не забудьте также прочитать комментарии).
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.
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, если переменная длина является переменной
CHAR(x)
Колонка может иметь только точно x
символы. Столбец может иметь до символов.VARCHAR(x)
x
Поскольку ваши хэши MD5 всегда будут одинакового размера, вам, вероятно, следует использовать CHAR
.
Тем не менее, вы не должны использовать MD5 в первую очередь; у него есть известные слабости.
Вместо этого используйте SHA2.
Если вы хэшируете пароли, вы должны использовать bcrypt.
В чем разница между VARCHAR и CHAR в MySQL?
К уже приведенным ответам я хотел бы добавить, что в системах OLTP или в системах с частыми обновлениями рекомендуется использовать CHAR
даже для столбцов переменного размера из-за возможной VARCHAR
фрагментации столбцов во время обновлений.
Я пытаюсь хранить хеши MD5.
MD5-хэш не лучший выбор, если безопасность действительно имеет значение. Однако, если вы будете использовать какую-либо хеш-функцию, рассмотрите BINARY
вместо нее тип (например, MD5 создаст 16-байтовый хеш, так BINARY(16)
что этого будет достаточно вместо CHAR(32)
32 символов, представляющих шестнадцатеричные цифры. Это сэкономит больше места и повысит производительность) .
Varchar обрезает завершающие пробелы, если введенные символы короче объявленной длины, а char - нет. Char будет заполнять пробелы и всегда будет иметь длину объявленной длины. С точки зрения эффективности, varchar более искусен, так как обрезает символы, чтобы обеспечить большую адаптацию. Однако, если вы знаете точную длину char, char будет выполняться с большей скоростью.
В большинстве СУБД сегодня они являются синонимами. Однако для тех систем, у которых все еще есть различие, поле CHAR сохраняется как столбец фиксированной ширины. Если вы определите его как CHAR (10), то в таблицу будет записано 10 символов, где «заполнение» (обычно пробелы) используется для заполнения любого пространства, которое не используются данными. Например, сохранение «bob» будет сохранено как («bob» +7 пробелов). Столбец VARCHAR (переменный символ) предназначен для хранения данных, не тратя впустую дополнительное пространство, которое занимает столбец CHAR.
Как всегда, Википедия говорит громче.
CHAR - поле фиксированной длины; VARCHAR - это поле переменной длины. Если вы храните строки с переменной длиной, например, именами, то используйте VARCHAR, если длина всегда одинакова, тогда используйте CHAR, потому что он немного более эффективен по размеру, а также немного быстрее.
CHAR - фиксированная длина, а VARCHAR - переменная длина. CHAR всегда использует одинаковый объем памяти для каждой записи, тогда как VARCHAR использует только объем, необходимый для хранения фактического текста.
Char - это символьный тип данных фиксированной длины, varchar - символьный тип данных переменной длины.
Поскольку char является типом данных фиксированной длины, размер хранилища значения char равен максимальному размеру для этого столбца. Поскольку varchar - это тип данных переменной длины, размер хранилища значения varchar - это фактическая длина введенных данных, а не максимальный размер для этого столбца.
Вы можете использовать char, если ожидается, что записи данных в столбце будут одинакового размера. Вы можете использовать varchar, когда ожидается, что размер данных в столбце будет значительно различаться.
согласно книге High Performance MySQL :
VARCHAR хранит символьные строки переменной длины и является наиболее распространенным типом строковых данных. Для него может потребоваться меньше места для хранения, чем для типов фиксированной длины, поскольку он использует столько места, сколько ему нужно (т. Е. Меньше места используется для хранения более коротких значений). Исключением является таблица MyISAM, созданная с ROW_FORMAT = FIXED, которая использует фиксированный объем пространства на диске для каждой строки и, таким образом, может тратить пространство. VARCHAR помогает производительности, потому что это экономит место.
CHAR фиксированной длины: MySQL всегда выделяет достаточно места для указанного количества символов. При сохранении значения CHAR MySQL удаляет все завершающие пробелы. (Это также относится к VARCHAR в MySQL 4.1 и более ранних версиях - CHAR и VAR CHAR были логически идентичны и отличались только форматом хранения.) Значения дополняются пробелами, необходимыми для сравнения.
VARCHAR
необходимо динамически распределять память по мере необходимости, что снижает производительность, а не так CHAR
, верно?
Char
имеет фиксированную длину (поддерживает 2000 символов), это символ для типа данных
Varchar
имеет переменную длину (поддерживает 4000 символов)
Char или varchar - используется для ввода текстовых данных, длина которых указывается в скобках. Например, имя char (20)
(
и )
скобки, а не скобки.
(
и )
скобки, и многие британцы , вероятно, даже не понимают , что есть диалекты английского языка , в котором слово «скобка» может относиться к знак препинания. Есть веские аргументы в пользу того, чтобы предпочитать «круглые скобки» «скобкам» - возможно, в конечном счете, это максимально понятный вариант для целевой аудитории программистов из разных стран - но это более сложный случай, чем «квадратные скобки», которые просто ошибочны.