Яка різниця між 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 буде генерувати план виконання. Припустимо, що є два стовпчики charcol char (2000) та VarcharCol Varchar (2000). У плані виконання орієнтовний розмір рядків для типів стовпців varchar може бути недооціненим. таким чином, це призводить до розливу до temp db. Тож використання char хороше для продуктивності
vignesh

1
яке значення значення в парантезі VARCHAR (n)?
Sivagami Nambi

@Marco Demaio Ви знаєте причину цього?
Дехан де Кроос

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

225

ЗАРАЗ

  1. Використовується для зберігання знаків рядка символів фіксованої довжини .
  2. Максимальний ні. символів, який може містити тип даних, становить 255 символів .
  3. Це на 50% швидше, ніж VARCHAR.
  4. Використовує статичний розподіл пам'яті .

ВАРЧАР

  1. Використовується для зберігання буквено-цифрових даних змінної довжини .
  2. Максимальний вміст цього типу даних може досягати
    • Pre-MySQL 5.0.3: 255 символів .
    • Post-MySQL 5.0.3: 65 555 символів, які спільно використовуються для рядка.
  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
не кажучи вже про те, що ви можете зберігати буквено-цифрові дані і в char
ninjabber

44
На чому це на 50% швидше? На 50% швидше робити що? В яких умовах? І що ви маєте на увазі під статичним розподілом пам'яті та динамічним у цьому контексті?
Мартін Сміт

4
@MartinSmith Я хотів би попросити те саме .. не думаю, що інформація точна. asktom.oracle.com/pls/asktom/…
бар Ozgur

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

122

ЧАР VS 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
Місто = char (10), Street = varchar (10), city = Pune, street = Oxford, довжина (city) = 4, довжина (street) = 6
abdulwadood

2
цей запит (виберіть довжину (місто), довжину (вулицю) від temp) дає наступний результат у mysql 5.7 mysql> виберіть довжину (місто), довжину (вулицю) від temp; + -------------- + ---------------- + | довжина (місто) | довжина (вулиця) | + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + 1 ряд у наборі (0,00 сек)
Jasbeer Rawal

69

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

Оскільки ваші хеші MD5 завжди будуть однакового розміру, ви, ймовірно, повинні використовувати CHAR .

Однак ви не повинні використовувати MD5 в першу чергу; він знає слабкі місця.
Використовуйте замість нього SHA2.
Якщо ви хешуєте паролі, вам слід використовувати bcrypt.


44
"Стовпець CHAR (x) може містити лише x символів." Насправді, ви можете додавати дані з меншими розмірами, ніж x знаків, але я думаю, ви мали на увазі, що це завжди ЗАБЕЗПЕЧЕНО 10 символів, що варті пам'яті за кадром.
Dan 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

Варчар обрізає пробіли, якщо введені символи коротші, ніж оголошена довжина, тоді як знаки символу не будуть. Char буде прокладати пробіли і завжди буде довжиною оголошеної довжини. З точки зору ефективності, varchar є більш спритним, оскільки він обрізає символи, щоб дозволити більше коригування. Однак якщо ви знаєте точну довжину знака, char буде виконуватись з трохи більшою швидкістю.


7

У більшості RDBMS сьогодні вони є синонімами. Однак для тих систем, які все ще мають відмінність, поле CHAR зберігається як стовпчик фіксованої ширини. Якщо визначити його як CHAR (10), то 10 таблиць записуються в таблицю, де "padding" (як правило, пробіли) використовується для заповнення будь-якого простору, який дані не використовують. Наприклад, збереження "bob" буде збережено як ("bob" +7 пробілів). Стовпець VARCHAR (змінний символ) призначений для зберігання даних, не витрачаючи зайвий простір, який займає стовпець CHAR.

Як завжди, Вікіпедія говорить голосніше.


5

CHAR - поле фіксованої довжини; VARCHAR - поле змінної довжини. Якщо ви зберігаєте рядки з дивовижною змінною довжиною, такі як імена, тоді використовуйте VARCHAR, якщо довжина завжди однакова, тоді використовуйте CHAR, оскільки вона трохи більш ефективна за розміром, а також трохи швидша.


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

1

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


1

Значок - це тип даних символів фіксованої довжини, varchar - тип даних символів змінної довжини.

Оскільки char - це тип даних фіксованої довжини, розмір сховища значення char дорівнює максимальному розміру для цього стовпця. Оскільки varchar - тип даних змінної довжини, розмір зберігання значення varchar - це фактична довжина введених даних, а не максимальний розмір для цього стовпця.

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


0

відповідно до книги 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 - використовується для введення текстових даних, де довжина може бути вказана у дужках.


Це не стосується початкового питання. ОП задає практичні відмінності між типами, а не синтаксисом та призначенням типів. Також (і )в круглих дужках, що не дужки.
2мак,

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

-11

CHAR:

  • Підтримує символи та цифри.
  • Підтримує 2000 символів.
  • Фіксована довжина.

ВАРХАР:

  • Підтримує символи та цифри.
  • Підтримує 4000 символів.
  • Змінна довжина.

будь-які коментарі ...... !!!!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.