Пределы хранения пользовательских переменных MySQL
В Пользовательские переменные, документы руководства MySQL:
Пользовательским переменным может быть присвоено значение из ограниченного набора типов данных: целочисленная, десятичная, с плавающей точкой, двоичная или недвоичная строка или значение NULL
. Присвоение десятичных и реальных значений не сохраняет точность или масштаб значения. Значение типа, отличного от одного из допустимых типов, преобразуется в допустимый тип. Например, значение, имеющее временный или пространственный тип данных, преобразуется в двоичную строку.
Если переменной пользователя присваивается недвоичное (символьное) строковое значение, она имеет тот же набор символов и сортировку в качестве строки. Согласованность пользовательских переменных неявна. (Это та же самая совместимость, что и для значений столбца таблицы.)
Однако в руководстве не указано:
-
размер поддерживаемых целых чисел (например, 4-байтовый INT
или 8-байтовый BIGINT
), независимо от того, подписаны они или нет, и применяется ли ZEROFILL
(если это так, используя ту ширину экрана);
Этот sqlfiddle, по-видимому, предполагает, что MySQL 5.5.25 будет использовать до BIGINT
, подписанный в соответствии с назначением, и не будет применять никаких ZEROFILL
.
-
точность и масштаб, используемые в значениях с фиксированной и плавающей точкой, при условии, что это не сохраняется из назначения; и
-
максимальная длина (в символах и/или байтах) строк.
sqlfiddle ограничен max_allowed_packet
из 2 20 байтов (которые я не могу изменить): я бы предположил, что LONGTEXT
из 2 32 байтов ( 4GiB).
На каких ограничениях можно безопасно полагаться, особенно в разных версиях сервера и конфигурациях?
Ответы
Ответ 1
Пользовательские переменные используют те же внутренние типы данных, которые MySQL использует для вычислений по значениям столбцов. Эти внутренние типы достаточно велики для всех типов данных, поддерживаемых MySQL.
- Целые числа не имеют
ZEROFILL
, поскольку это дополнительное свойство столбца, а не самого типа данных. Кроме того, целочисленные пользовательские переменные не имеют ширины; при преобразовании в текст они используют столько же цифр, сколько необходимо.
- Значения с плавающей запятой не имеют масштаба. 64-битные поплавки IEEE являются двоичными значениями и имеют достаточную точность для около 18 десятичных цифр.
- Строки должны теоретически содержать любое значение
LONGTEXT
, если max_allowed_packet
достаточно велико, и у вас достаточно памяти. Однако для пользовательских переменных имеется недокументированный предел в 16 МБ, упомянутый в ошибка 31898.