在数据库INT字段中保留4位数?
维持数据库INT中的4位数字?
这个问题出现的原因是,某些人喜欢在数据库中使用方框形式的填充。
解决方法是,在插入时,将数字按照4位进行填充,而在选择时,将值进行零填充。
代码示例:
-- 创建一个名为table_name的表,包含一个名为column_name的INT列 CREATE TABLE table_name ( column_name INT ); -- 插入数据时,将数字按照4位进行填充 INSERT INTO table_name (column_name) VALUES (LPAD(1, 4, '0')), (LPAD(23, 4, '0')), (LPAD(123, 4, '0')); -- 选择数据时,将值进行零填充 SELECT LPAD(column_name, 6, '0') FROM table_name;
通过以上方法,可以在数据库中维持4位数字。
在使用ZEROFILL
类型的列时,它会在字段的显示值上填充零,直到达到列定义中指定的显示宽度。超过显示宽度的值不会被截断。需要注意的是,使用ZEROFILL
也意味着使用了UNSIGNED
。
使用ZEROFILL
和显示宽度对数据的存储没有影响,它只影响数据的显示。
下面是一个演示使用ZEROFILL
的示例SQL代码:
CREATE TABLE yourtable (x INT(8) ZEROFILL NOT NULL, y INT(8) NOT NULL); INSERT INTO yourtable (x,y) VALUES (1, 1), (12, 12), (123, 123), (123456789, 123456789); SELECT x, y FROM yourtable;
运行结果:
x y 00000001 1 00000012 12 00000123 123 123456789 123456789
如果您想让所有的发票编号显示为10位数,则可以将该列的类型声明为INT(10) ZEROFILL
。
我强烈建议您避免使用这个特性 - 数值的显示/格式化是一个表现层的关注点,绝对不是数据库层面的事情,至少如果您使用数据库来支持软件的话。请注意,这可能会导致问题 - 如果您将一个带有前导零的值解析为整数,许多解析器将把该值视为八进制数,这可能不是您想要的。唯一应该使用此特性的时候是作为一种(存储)优化,当您实际上存储的是一个(固定长度的)数字字符串时。
.dk:这取决于情况。如果您存储的是类似于GTIN这样的值,它们必须是14位数,但也可以只有8位数,并且左侧填充零。在这种情况下,依赖输出端是不正确的,因为它不仅仅是一个小数,而是一个键。
实际上,大多数客户端库(例如PHP)在将值传递给应用程序代码之前会简单地去掉零吗?如果是这样,那么它似乎有点没有意义。这是MySQL早期的一个设计失误。
我和.有同样的问题。对于所有实际目的来说,int
列将映射到应用程序语言中的数字类型。显示属性会被忽略吗?我想不出JavaScript、C#或Java中存在带有显示属性的数字类型。
“在字段的显示值上填充零,直到达到列定义中指定的显示宽度”。有趣的是,我以前从未将长度称为“显示宽度”。我认为这是根据您选择的整数类型自动更改/设置的,所以我认为它与实际大小更相关,而不是期望的显示宽度。虽然我一直在使用PhpMyAdmin,并在使用char或varchar时将其留空。
维护数据库中的四位数(Maintain 4 digits in database INT?)
在德国,我们有5位数的邮政编码。然而,这些编码可能以零开头,所以80337是慕尼黑的有效邮政编码,01067是柏林的邮政编码。正如你所看到的,德国公民希望邮政编码显示为5位数,所以1067看起来很奇怪。为了存储这些数据,可以使用VARCHAR(5)或INT(5) ZEROFILL,而使用零填充整数有两个主要优点:
1. 在硬盘上占用更少的存储空间
2. 如果你插入1067,你仍然会得到01067
也许这个例子有助于理解ZEROFILL的用途。值得补充的是,显示数据的SQL客户端负责使用前导零格式化数字。这不是每个应用程序检索数据时都会自动发生的事情。固定宽度的列也更好,因为它们减少了磁盘碎片。
实际上,大多数客户端库(如PHP)在将其传递给应用程序代码之前会将零去掉,这样做似乎有些无意义。这是MySQL早期设计的一个问题。
这取决于您希望客户端库中的数据如何表示:作为数字还是字符串。德国的邮政编码不是一个数字,它是由数字组成的字符串。因此,我不同意您关于MySQL早期设计的观点。这仍然是一种有效的方法,但只适用于罕见的情况。在使用原生扩展(如mysqli)时,默认情况下,PHP将所有值都作为字符串检索,但是您可以使用mysqli::options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE)将整数和浮点数值作为数字检索。