Подтвердить что ты не робот

Пределы хранения пользовательских переменных 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).

На каких ограничениях можно безопасно полагаться, особенно в разных версиях сервера и конфигурациях?

4b9b3361

Ответ 1

Пользовательские переменные используют те же внутренние типы данных, которые MySQL использует для вычислений по значениям столбцов. Эти внутренние типы достаточно велики для всех типов данных, поддерживаемых MySQL.

  • Целые числа не имеют ZEROFILL, поскольку это дополнительное свойство столбца, а не самого типа данных. Кроме того, целочисленные пользовательские переменные не имеют ширины; при преобразовании в текст они используют столько же цифр, сколько необходимо.
  • Значения с плавающей запятой не имеют масштаба. 64-битные поплавки IEEE являются двоичными значениями и имеют достаточную точность для около 18 десятичных цифр.
  • Строки должны теоретически содержать любое значение LONGTEXT, если max_allowed_packet достаточно велико, и у вас достаточно памяти. Однако для пользовательских переменных имеется недокументированный предел в 16 МБ, упомянутый в ошибка 31898.