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