Что означает указанное число в предложении VARCHAR ()? - PullRequest
1 голос
/ 30 марта 2010

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

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

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

Ответы [ 6 ]

1 голос
/ 30 марта 2010

char и varchar на самом деле становятся неактуальными, если в вашей таблице только 1 поле переменной длины, например, varchar или текст. Mysql автоматически изменит все символы на varchar.

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

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

1 голос
/ 30 марта 2010

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

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

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

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

1 голос
/ 30 марта 2010

Вы также должны указать размер с 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 может просто хранить значение (фиксированного размера).

0 голосов
/ 30 марта 2010

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

varchar2(45 BYTE)

или

varchar2(45 CHAR)

См. Разница между BYTE и CHAR в типах данных столбцов

0 голосов
/ 30 марта 2010

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

0 голосов
/ 30 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...