【问题标题】:Difference of BigINT and VarChar, length 16 charsBigINT 和 VarChar 的区别,长度为 16 个字符
【发布时间】:2019-07-28 19:04:26
【问题描述】:

我对存储数字代码的最佳解决方案有疑问

(例如:1234123412341234)。

此代码始终有 16 个字符并且是数值!

我使用 InnoDB 引擎来存储表

目前我有列 VarChar(16) 的类型,但我想 bigint 是否更适合这个。

添加到数据库后,列代码不被编辑。

【问题讨论】:

  • 如果值总是整数,并且不大于(2^64)-1(对你来说足够大),那么使用 bigint 会更好。
  • 如果需要数字,请使用数字格式。字符串必须转换为数字。
  • 真的没有区别(或者几乎没有区别)

标签: php mysql mariadb


【解决方案1】:
  • Bigint 需要 8 个字节来存储一个数字,而 varchar(16) 至少需要双倍的字节数。根据使用的字符集,甚至是 4 倍。所以 bigint 类型会节省磁盘空间,但也会减少网络流量。

  • varchar(16) 将无法表示所有 bigint 数字。无符号 bigint 值 0xFFFFFFFFFFFFFFFFFE 不能存储在 varchar(16) 列中。

  • 在机器级别,16 字节的比较通常在一个周期内进行,而比较字符串的成本要高得多,因为 varchar 需要逐字节比较。

【讨论】:

    【解决方案2】:

    您应该根据您拥有的数据选择数据类型。

    例如,信用卡号码是一个字符串(即使它包含数字),电话号码也是一个字符串(例如,字符串可以有前导零等)。

    具有数值的数字应存储为数字(例如到月球的距离)。

    【讨论】:

      【解决方案3】:

      要问的关键问题是需要对数据进行哪些操作

      • BigInt 这样的数字数据类型可用于加法、减法、乘法、除法等运算。值将被规范化,以便 10011.0 等都以相同的方式存储。
      • VarChar 等字符串数据类型可用于子字符串匹配等操作。它可以存储像0001 这样的值,而无需对其进行规范化。

      很少有一条数据同时需要这两种类型的操作。例如,您可能想查找以“1800”开头的所有电话号码,但永远不需要将电话号码除以 3。

      所以当你说你的数据是一个“数字代码”时,你需要考虑这个值实际上是一个数字,还是只是一个全是数字的字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多