MySQL
Типы данных
Поиск…
Неявное / автоматическое литье
select '123' * 2;
Чтобы сделать умножение с помощью 2
MySQL, автоматически преобразует строку 123
в число.
Возвращаемое значение:
246
Преобразование в число начинается слева направо. Если преобразование невозможно, результат равен 0
select '123ABC' * 2
Возвращаемое значение:
246
select 'ABC123' * 2
Возвращаемое значение:
0
VARCHAR (255) - или нет
Предлагаемая максимальная длина
Во-первых, я упомянул некоторые общие строки, которые всегда являются шестнадцатеричными или иным образом ограничиваются ASCII. Для этого вы должны указать CHARACTER SET ascii
( latin1
в порядке), чтобы он не терял пространство:
UUID CHAR(36) CHARACTER SET ascii -- or pack into BINARY(16)
country_code CHAR(2) CHARACTER SET ascii
ip_address CHAR(39) CHARACTER SET ascii -- or pack into BINARY(16)
phone VARCHAR(20) CHARACTER SET ascii -- probably enough to handle extension
postal_code VARCHAR(20) CHARACTER SET ascii -- (not 'zip_code') (don't know the max
city VARCHAR(100) -- This Russian town needs 91:
Poselok Uchebnogo Khozyaystva Srednego Professionalno-Tekhnicheskoye Uchilishche Nomer Odin
country VARCHAR(50) -- probably enough
name VARCHAR(64) -- probably adequate; more than some government agencies allow
Почему бы не просто 255? Есть две причины избежать обычной практики использования (255) для всего.
- Когда сложный
SELECT
должен создать временную таблицу (для подзапроса,UNION
,GROUP BY
и т. Д.), Предпочтительным выбором является использование механизмаMEMORY
, который помещает данные в ОЗУ. НоVARCHARs
в процессе превращаются вCHAR
. Это заставляетVARCHAR(255) CHARACTER SET utf8mb4
принимать 1020 байт. Это может привести к необходимости разливать на диск, что происходит медленнее. - В некоторых ситуациях InnoDB будет рассматривать потенциальный размер столбцов в таблице и решить, что он будет слишком большим, прерывая
CREATE TABLE
.
VARCHAR против ТЕКСТА
Рекомендации по использованию для *TEXT
, CHAR
и VARCHAR
, а также некоторые рекомендации:
- Никогда не используйте
TINYTEXT
. - Почти никогда не используйте
CHAR
- фиксированная длина; каждый символ - это максимальная длинаCHARACTER SET
(например, 4 байта / символ для utf8mb4). - С
CHAR
используйтеCHARACTER SET ascii
если вы не знаете иначе. -
VARCHAR(n)
будет усекать при n символах ;TEXT
будет усекаться при некотором количестве байтов . (Но, вы хотите усечение?) -
*TEXT
может замедлить сложныеSELECTs
из-за того, как обрабатываются временные таблицы.
INT как AUTO_INCREMENT
Любой размер INT
может использоваться для AUTO_INCREMENT
. UNSIGNED
всегда уместен.
Имейте в виду, что определенные операции «сжигают» AUTO_INCREMENT
ids. Это может привести к неожиданному разрыву. Примеры: INSERT IGNORE
и REPLACE
. Они могут предварительно распределить идентификатор, прежде чем понимать, что он не понадобится. Это ожидаемое поведение и дизайн в движке InnoDB и не должны препятствовать их использованию.
другие
Уже существует отдельная запись для «FLOAT, DOUBLE, DECIMAL» и «ENUM». Одна страница из типов данных, вероятно, будет громоздкой - я предлагаю «Типы полей» (или ее следует называть «Типы данных»?) - это обзор, а затем разделить на эти страницы тем:
- INTS
- FLOAT, DOUBLE и DECIMAL
- Строки (CHARs, TEXT и т. Д.)
- BINARY и BLOB
- DATETIME, TIMESTAMP и друзья
- ENUM и SET
- Пространственные данные
- Тип JSON (MySQL 5.7.8+)
- Как представлять деньги и другие общие «типы», которые нуждаются в обучении в существующих типах данных
Там, где это необходимо, каждая страница темы должна включать, помимо синтаксиса и примеров:
- Соображения, когда ALTERING
- Размер (байты)
- Контраст с двигателями, отличными от MySQL (с низким приоритетом)
- Соображения при использовании типа данных в PRIMARY KEY или вторичном ключе
- другая передовая практика
- другие проблемы с производительностью
(Я предполагаю, что этот «пример» будет самоликвидироваться, когда мои предложения будут удовлетворены или наложены вето.)
Введение (числовое)
MySQL предлагает несколько различных числовых типов. Они могут быть разбиты на
группа | Типы |
---|---|
Целочисленные типы | INTEGER , INT , SMALLINT , TINYINT , MEDIUMINT , BIGINT |
Типы фиксированных точек | DECIMAL , NUMERIC |
Типы с плавающей точкой | FLOAT , DOUBLE |
Тип битового значения | BIT |
Целочисленные типы
Минимальное значение без знака всегда равно 0.
Тип | Место хранения (Б) | Минимальное значение (Подпись) | Максимальное значение (Подпись) | Максимальное значение (Без знака) |
---|---|---|---|---|
TINYINT | 1 | -2 7 -128 | 2 7 -1 127 | 2 8 -1 255 |
SMALLINT | 2 | -2 15 -32768 | 2 15 -1 32767 | 2 16 -1 65535 |
MEDIUMINT | 3 | -2 23 -8388608 | 2 23 -1 8388607 | 2 24 -1 16777215 |
INT | 4 | -2 31 -2147483648 | 2 31 -1 2147483647 | 2 32 -1 4294967295 |
BIGINT | 8 | -2 63 -9.223.372.036.854.775.808 | 2 63 -1 9.223.372.036.854.775.807 | 2 64 -1 18.446.744.073.709.551.615 |
Типы фиксированных точек
Типы DECIMAL
и NUMERIC
MySQL хранят точные значения числовых данных. Рекомендуется использовать эти типы, чтобы сохранить точную точность, например, за деньги.
Десятичный
Эти значения сохраняются в двоичном формате. В объявлении столбца должны быть указаны точность и масштаб
Precision представляет количество значащих цифр, которые сохраняются для значений.
Масштаб представляет количество цифр, хранящихся после десятичной
salary DECIMAL(5,2)
5 представляет precision
а 2 - scale
. В этом примере диапазон значений, которые могут быть сохранены в этом столбце, составляет от -999.99 to 999.99
Если параметр масштаба опущен, по умолчанию он равен 0
Этот тип данных может хранить до 65 цифр.
Количество байтов, полученных DECIMAL(M,N)
составляет приблизительно M/2
.
Типы с плавающей точкой
FLOAT
и DOUBLE
представляют собой приблизительные типы данных.
Тип | Место хранения | точность | Спектр |
---|---|---|---|
FLOAT | 4 байта | 23 значащих бита / ~ 7 десятичных цифр | 10 ^ + / - 38 |
DOUBLE | 8 байт | 53 значащих бита / ~ 16 десятичных цифр | 10 ^ + / - 308 |
REAL
является синонимом FLOAT
. DOUBLE PRECISION
является синонимом DOUBLE
.
Хотя MySQL также разрешает (M, D) квалификатор, не использовать его. (M, D) означает, что значения могут быть сохранены с точностью до M суммарных цифр, где D может быть после десятичной. Числа будут округлены дважды или усечены; это вызовет больше проблем, чем пользы.
Поскольку значения с плавающей запятой являются приблизительными и не сохраняются в виде точных значений, попытки рассматривать их как точные в сравнении могут привести к проблемам. Обратите внимание, в частности, что значение FLOAT
редко принимает значение DOUBLE
.
Тип битового значения
Тип BIT
полезен для хранения значений битового поля. BIT(M)
позволяет хранить до M-бит значений, где M находится в диапазоне от 1 to 64
Вы также можете указать значения с нотой bit value
.
b'111' -> 7
b'10000000' -> 128
Иногда удобно использовать «shift» для построения однобитового значения, например (1 << 7)
для 128.
Максимальный комбинированный размер всех столбцов BIT в таблице NDB
равен 4096.
СИМ (п)
CHAR(n)
- строка фиксированной длины n
символов . Если это CHARACTER SET utf8mb4
, это означает, что он занимает ровно 4*n
байтов , независимо от того, какой текст в нем.
Большинство случаев использования CHAR(n)
включают строки, содержащие английские символы, поэтому должен быть CHARACTER SET ascii
. ( latin1
будет так же хорошо).
country_code CHAR(2) CHARACTER SET ascii,
postal_code CHAR(6) CHARACTER SET ascii,
uuid CHAR(39) CHARACTER SET ascii, -- more discussion elsewhere
DATE, DATETIME, TIMESTAMP, YEAR и TIME
Тип данных DATE
содержит дату, но не временную составляющую. Его формат - 'YYYY-MM-DD'
с диапазоном от «1000-01-01» до «9999-12-31».
Тип DATETIME
включает время с форматом «YYYY-MM-DD HH: MM: SS». Он имеет диапазон от «1000-01-01 00:00:00» до «9999-12-31 23:59:59».
Тип TIMESTAMP
- это целочисленный тип, содержащий дату и время с эффективным диапазоном от '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' UTC.
Тип YEAR
представляет год и имеет диапазон от 1901 до 2155.
Тип TIME
представляет собой время с форматом «HH: MM: SS» и имеет диапазон от «-838: 59: 59» до «838: 59: 59».
Требования к хранению:
|-----------|--------------------|----------------------------------------|
| Data Type | Before MySQL 5.6.4 | as of MySQL 5.6.4 |
|-----------|--------------------|----------------------------------------|
| YEAR | 1 byte | 1 byte |
| DATE | 3 bytes | 3 bytes |
| TIME | 3 bytes | 3 bytes + fractional seconds storage |
| DATETIME | 8 bytes | 5 bytes + fractional seconds storage |
| TIMESTAMP | 4 bytes | 4 bytes + fractional seconds storage |
|-----------|--------------------|----------------------------------------|
Дробные секунды (с версии 5.6.4):
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
См. Типы страниц DATE, DATETIME и TIMESTAMP MySQL , типы хранения данных и дробные секунды во временных значениях .