【发布时间】:2011-01-29 04:00:43
【问题描述】:
我有一个bigint 字段,例如,当输入诸如'05555555555' 之类的数字时,0 被剥离,仅插入'5555555555'。
我应该使用什么数据类型来防止这种情况发生?
【问题讨论】:
标签: mysql
我有一个bigint 字段,例如,当输入诸如'05555555555' 之类的数字时,0 被剥离,仅插入'5555555555'。
我应该使用什么数据类型来防止这种情况发生?
【问题讨论】:
标签: mysql
你不能。整数列(bigint's)不存储前导零(即在视觉表示中)
与其尝试存储前导零(通过使用 varchar 字段),不如让视图(或其他)将整数格式化为您需要的格式的字符串。
如果您需要在域模型中存储实际上是字符串的内容(例如电话号码),请使用字符串而不是整数类型字段。
【讨论】:
BIGINT 和其他 Integer 列不存储数字的视觉表示,仅存储二进制形式的数字本身(BIGINT 为 8 个字节)。 5555555555 存储为:
00000000 00000000 00000000 00000001 01001011 00100011 00001100 11100011
如果前面的零对数据的完整性很重要,则应使用VARCHAR 或CHAR 而不是整数类型。数值数据类型只能用于数值数据。美国邮政编码和电话号码不是数字数据。
【讨论】:
bigint将数据存储为一个数字,05555555555和5555555555是同一个数字。您需要一个字符串类型来保留前导零,例如varchar 具有合适的最大长度。
【讨论】:
您可能会考虑更改该字段以使用 UNSIGNED ZEROFILL。这应该允许您存储带有前导零的数字。
【讨论】:
ZEROFILL 不允许您存储前导零。如果它的长度小于定义,它只是告诉 DBMS 在返回结果前加上零。
ZEROFILL 不是这里的答案。
ZEROFILL 不会影响存储的实际数据。但是,有些人更喜欢此功能的便利性,而不是每次检索数据时都必须记住解析数据。尽管这是出租人的选择,但我还是发布了这个,因为我喜欢在阅读论坛时看到多种解决方案。
问题是,如果您有一个包含数十万行的大型数据库,那么 bigint 比 VARHAR 字段要快得多。我在充满欧洲商品编号(EAN)的产品数据库中遇到了类似的问题。其中一些代码以前导 0 开头当我将其更改为 VARCHAR 时,加载某些搜索 EAN 代码的页面需要 8 秒,当我更改它到 BIGINT 变成 2 秒。 速度确实相差很大。
【讨论】: