Краткий ответ: Как говорит Тадман: «Используйте VARCHAR и не беспокойтесь об этом»
Длинный ответ:
Пространство, занимаемое столбцом, является основным фактором как для пространства, так и для него.speed.
Можно объявить действительно строки фиксированной длины CHAR(..)
.Очень часто они состоят только из символов ascii, поэтому «правильный» способ сделать это, например,
country_code CHAR(2) CHARACTER SET ascii
uuid CHAR(36) CHARACTER SET ascii
Разница между фиксированной длиной VARCHAR
вместо CHAR
- это 1- или 2-байтовое поле длины, предшествующее фактической строке.Если у вас нет миллиардов строк, это не имеет большого значения.
Разница в скорости обработки незначительна, но CHAR
и ascii
выигрывают.
Если у вас есть всечисловые строки, вы можете хотите использовать INT
4 байта или BIGINT
8 байтов или DECIMAL(30)
14 байтов и т. д. - вместо использования CHAR
или VARCHAR
, который будет иметь 1байт на цифру.Числовые поля имеют фиксированную длину.Но будь осторожен.Телефонные номера в США имеют фиксированную длину, но международные номера различаются.
Вы подразумеваете, что есть что-то, кроме "буквенно-цифрового"Если вы ссылаетесь на BINARY
/ VARBINARY
/ BLOB
, то правила в основном одинаковы.
Например, значение uuid может быть уменьшено с CHAR(36)
(36 байт) до BINARY(16)
(16 байт) с помощью подходящего преобразования.Последнее лучше для скорости и пространства, но добавляет сложности вашему коду.(Во всяком случае, uuids ужасны для огромного стола; это другая тема.)
С целыми числами всегда учитывайте BIGINT
против INT
против MEDIUMINT
против SMALLINT
против TINYINT
, и обычно тэксна UNSIGNED
.(Они занимают 8/4/3/2/1 байт соответственно.) Сделайте это при первоначальном создании таблицы;ALTER
позже делать грязно.