14

User-Defined Variables下,MySQL 手册文档:

可以从一组有限的数据类型中为用户变量分配一个值:整数、十进制、浮点、二进制或非二进制字符串或NULL值。十进制和实数值的分配不会保留值的精度或小数位数。将除允许类型之一之外的类型的值转换为允许类型。例如,具有时间或空间数据类型的值被转换为二进制字符串。

如果为用户变量分配了非二进制(字符)字符串值,则它具有与字符串相同的字符集和排序规则。用户变量的强制性是隐含的。(这与表列值的强制力相同。)

但是手册没有说明:

  • 支持的整数的大小(例如 4-byteINT或 8-byte BIGINT),它们是有符号还是无符号,以及是否ZEROFILL应用(如果是,使用什么显示宽度);

    这个 sqlfiddle 似乎暗示 MySQL 5.5.25 将使用 up to BIGINT,根据分配进行签名,并且不会应用任何ZEROFILL.

  • 定点值和浮点值中使用的精度和小数位数,因为赋值中没有保留这点;和

  • 字符串的最大长度(以字符和/或字节为单位)。

    sqlfiddle 受限于max_allowed_packet2 20字节(我无法更改):我猜想支持LONGTEXT2 32字节(4GiB)。

可以安全地依赖哪些限制,尤其是跨不同的服务器版本和配置?

4

1 回答 1

6

用户变量使用 MySQL 用于计算列值的相同内部数据类型。这些内部类型对于MySQL 支持的所有数据类型都足够大。

  • 整数没有ZEROFILL,因为这是列的附加属性,而不是数据类型本身的属性。此外,整数用户变量没有宽度;当转换为文本时,它们会根据需要使用尽可能多的数字。
  • 浮点值没有刻度。64 位 IEEE 浮点数是二进制值,对于大约 18 位十进制数字具有足够的精度。
  • 理论上,如果字符串足够大并且您有足够的内存,则字符串应该保持任何LONGTEXT值。max_allowed_packet但是,在错误 31898中提到,用户变量有 16 MB 的未记录限制。
于 2012-10-17T21:38:20.793 回答