【问题标题】:Storage limits of MySQL user-defined variablesMySQL用户定义变量的存储限制
【发布时间】:2012-09-06 07:26:02
【问题描述】:

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

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

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

但是手册没有说明:

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

    This sqlfiddle 似乎表明 MySQL 5.5.25 将使用最多 BIGINT,根据分配进行签名,并且不会应用任何 ZEROFILL

  • 在定点和浮点值中使用的精度和小数位数,假设这不会从赋值中保留;和

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

    sqlfiddle 受限于 max_allowed_packet 的 220 个字节(我无法更改):我 LONGTEXT 的 2支持 32 字节 (4GiB)。

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

【问题讨论】:

    标签: mysql variables


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这是我的工作假设。我不认为你可以引用一些权威来参考?
    • 没有记录用户变量的属性。唯一的权威是源代码,但这并不能保证未来版本的任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2010-12-08
    • 2011-03-13
    • 2015-11-04
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多