Поиск…


Неявное / автоматическое литье

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 , типы хранения данных и дробные секунды во временных значениях .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow