强制 MySQL CHAR() 列要求所有数字或自动左填充零
Posted
技术标签:
【中文标题】强制 MySQL CHAR() 列要求所有数字或自动左填充零【英文标题】:Forcing MySQL CHAR() column to require all digits or auto left pad with zeros 【发布时间】:2013-09-26 13:27:23 【问题描述】:我正在设计一个存储 5 位美国邮政编码的表格,不带扩展名。看起来领先的竞争者是CHAR(5)
和MEDIUMINT (5) UNSIGNED ZEROFILL
。参考:
出于Is it a good idea to use an integer column for storing US ZIP codes in a database? 所述的原因,我计划使用 CHAR(5)。 编辑-因此,使用ZEROFILL
不是答案,所以请不要让我使用ZEROFILL
或关闭此问题并参考之前的答案,上面写着使用ZEROFILL
。
接下来,我要确保始终存储 (5) 个字符,如果提供的字符较少,则查询会产生错误,或者用零填充(而不是用空格填充)。我的目的是防止邮政编码“3101”永远存在于数据库中,并确保它必须是“03101”。请注意,我不是询问如何使 php 应用程序在左侧用零填充邮政编码。
【问题讨论】:
为什么你更喜欢 char 而不是 mediumint 呢,你要求什么,更快,使用更少的存储空间? @JohnConde。这不需要整数字段吗?大多数人不同意使用一个。 您链接到的 This question 提供了答案。使用ZEROFILL。 @UtkuYıldırım。我更喜欢 char() 而不是 int 的原因:***.com/questions/893454/… 另一个重复 - ***.com/questions/3200754/… 【参考方案1】:您可以使用 LPAD 函数将值左填充零。
LPAD (zip_code, 5, '0')
【讨论】:
这不要求数据存储5个字符,只检索5个字符。 你是对的。我在想你可以在保存记录时使用这样的东西。【参考方案2】:如果您将 zerofill 属性添加到该字段并将长度设置为 5,它将向左填充零,如您提供的链接中所述。
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`test` int(5) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
请务必在输入之前验证 zip。
有时邮政编码有 4 位数字后缀。如果您希望您可能有一些这种格式的邮政编码,可能希望将其设为 char(10)。或者一个 zip_suffix 列。
【讨论】:
谢谢托德,对错我宁愿不使用int()
,而是使用char()
【参考方案3】:
首先,如果您打算只保存数字,则最好使用 SMALLINT 而不是 CHAR。 INT 及其衍生物就是为此而生的: - ti 将占用更少的空间 - 它会变得更容易读/写(即使差异很小)
为了确保您始终有 5 个字符,您必须使用 ZEROFILL。你应该看看这个帖子:What is the benefit of zerofill in MySQL?
【讨论】:
谢谢,但我还是希望使用 char() 而不是 smallint。以上是关于强制 MySQL CHAR() 列要求所有数字或自动左填充零的主要内容,如果未能解决你的问题,请参考以下文章
使用 javascript 或 jQuery 隐藏所有带有与数字“0”或自定义值匹配的文本或 innerHTML 的“a”元素