MySQL的 – 如何前面填充“0”的邮政编码?

在我的MySQL InnoDB数据库中,我有我想要清理的肮脏的邮政编码数据。

干净的邮政编码数据是当我有一个邮政编码的全部5位数字(例如“90210”)。

但由于某种原因,我注意到在我的数据库中,对于以“0”开头的zipcode,0已被丢弃。

因此,邮编“ 00544 ”的“ 纽约州 00544 ”在我的数据库中被存储为“ 544

邮编“ 02026 ”的“ Dedham,MA ”作为“ 2026 ”存储在我的数据库中。

什么SQL可以运行前面填充“0”的任何邮编不是5位数字的长度? 意思是,如果邮政编码是3位数字,前面板“00”。 如果邮政编码是4位数字,前面垫只是“0”。

更新

我只是将邮政编码改为数据typesVARCHAR(5)

将您的邮政编码存储为CHAR(5)而不是数字types,或者在从数据库加载时将应用程序填充为零。 一种使用sprintf()使用PHP的方法:

 echo sprintf("%05d", 205); // prints 00205 echo sprintf("%05d", 1492); // prints 01492 

或者你可以用LPAD()为你LPAD()它:

 SELECT LPAD(zip, 5, '0') as zipcode FROM table; 

以下是更新和填充所有行的方法:

 ALTER TABLE `table` CHANGE `zip` `zip` CHAR(5); #changes type UPDATE table SET `zip`=LPAD(`zip`, 5, '0'); #pads everything 

你需要决定邮政编码的长度(我相信应该是5个字符长)。 那么你需要告诉MySQL来填充数字。

我们假设你的表被称为mytable ,问题是zipcode ,inputsmallint 。 您需要发出以下查询:

 ALTER TABLE mytable CHANGE `zipcode` `zipcode` MEDIUMINT( 5 ) UNSIGNED ZEROFILL NOT NULL; 

这种方法的优点是可以保持数据完整无缺,在数据插入/更新过程中不需要使用触发器,在SELECT数据时不需要使用函数,而且您总是可以删除多余的零或增加字段长度你应该改变主意吗?

好的,所以你已经把Number从Number切换到了VARCHAR(5)。 现在您需要更新左侧填充的邮政编码字段。 这样做的SQL将是:

 UPDATE MyTable SET ZipCode = LPAD( ZipCode, 5, '0' ); 

这会将ZipCode列中的所有值填充为5个字符,在左侧添加“0”。

当然,现在你已经修复了所有的旧数据,你需要确保你的新数据也是零填充的。 在正确的方法上有几种思想stream派:

  • 在应用程序的业务逻辑中处理它。 优点:独立于数据库的解决scheme,不涉及更多关于数据库的知识。 缺点:需要在所有应用程序中写入数据库的任何地方进行处理。

  • 用存储过程处理它。 优点:存储过程为所有客户强制执行业务规则。 缺点:存储过程比简单的INSERT / UPDATE语句更为复杂,而且不像跨数据库的可移植性。 裸INSERT / UPDATE仍然可以插入非零填充的数据。

  • 用扳机处理。 优点:适用于存储过程和裸INSERT / UPDATE语句。 缺点:最便携的解决scheme。 最慢的解决scheme。 触发器可能很难正确。

在这种情况下,我会在应用程序级(如果有的话)处理它,而不是数据库级。 毕竟,并不是所有的国家都使用5位的邮政编码(即使是美国,我们的邮政编码实际上是Zip + 4 + 2:nnnnn-nnnn-nn),有些还允许使用字母和数字。 最好不要尝试强制数据格式并接受偶然的数据错误,而不要阻止某人input正确的值,尽pipe它的格式不是您所期望的。

将邮政编码字段创build为无符号整数字段仍然有意义。

CREATE TABLE xxx ( zipcode INT(5) ZEROFILL UNSIGNED, ... )

这样的方式MySQL照顾你的填充。

 CHAR(5) 

要么

 MEDIUMINT (5) UNSIGNED ZEROFILL 

第一个邮政编码需要5个字节。

第二个邮政编码只需要3个字节。 ZEROFILL选项对于前导零的邮政编码是必需的。

你应该在你的表格结构中使用UNSIGNED ZEROFILL

LPAD与VARCHAR2一起使用,因为它不会在字节上留下空格。 LPAD在LHS上将剩余/空字节更改为零。SO数据types应该是VARCHAR2