Ted*_*dyR 86 mysql sql database database-design
在我的MySQL InnoDB数据库中,我有要清理的脏邮政编码数据.
干净的邮政编码数据是当我拥有邮政编码的所有5位数字时(例如"90210").
但出于某种原因,我注意到在我的数据库中,对于以"0"开头的zipcodes,0已被删除.
所以带有邮政编码" "的" Holtsville,New York " 00544在我的数据库中存储为" 544"
和
" Dedham,MA "和邮政编码" 02026"在我的数据库中存储为" 2026".
我可以在前面填充"0"到任何长度不是5位的邮政编码运行什么SQL?意思是,如果邮政编码长度为3位,则前垫"00".如果邮政编码长度为4位,则前面板只有"0".
更新:
我刚刚将zipcode更改为数据类型VARCHAR(5)
qua*_*oup 204
将您的邮政编码存储为CHAR(5)而不是数字类型,或者在从数据库加载时将应用程序填充为零.使用PHP的方法sprintf():
echo sprintf("%05d", 205); // prints 00205
echo sprintf("%05d", 1492); // prints 01492
Run Code Online (Sandbox Code Playgroud)
或者你可以让MySQL为你填充它LPAD():
SELECT LPAD(zip, 5, '0') as zipcode FROM table;
Run Code Online (Sandbox Code Playgroud)
这是一种更新和填充所有行的方法:
ALTER TABLE `table` CHANGE `zip` `zip` CHAR(5); #changes type
UPDATE table SET `zip`=LPAD(`zip`, 5, '0'); #pads everything
Run Code Online (Sandbox Code Playgroud)
Ana*_*nax 17
你需要决定邮政编码的长度(我认为应该是5个字符长).然后你需要告诉MySQL零填充数字.
假设您的表被调用,mytable并且有问题的字段是zipcode,键入smallint.您需要发出以下查询:
ALTER TABLE mytable CHANGE `zipcode` `zipcode`
MEDIUMINT( 5 ) UNSIGNED ZEROFILL NOT NULL;
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是它可以保持数据的完整性,在数据插入/更新过程中不需要使用触发器,在数据时不需要使用函数,SELECT并且可以随时删除额外的零或增加字段长度你改变了主意.
Cra*_*der 11
好的,所以你已经将列从Number切换到VARCHAR(5).现在您需要更新要填充的zipcode字段.执行此操作的SQL将是:
UPDATE MyTable
SET ZipCode = LPAD( ZipCode, 5, '0' );
Run Code Online (Sandbox Code Playgroud)
这会将ZipCode列中的所有值填充为5个字符,并在左侧添加"0".
当然,既然你已经修复了所有旧数据,你需要确保你的任何新数据都是零填充的.关于正确的方法,有几种思想流派:
在应用程序的业务逻辑中处理它.优点:独立于数据库的解决方案,不涉及更多地了解数据库.缺点:需要在所有应用程序中处理写入数据库的所有位置.
使用存储过程处理它.优点:存储过程为所有客户端强制执行业务规则.缺点:存储过程比简单的INSERT/UPDATE语句更复杂,而不是跨数据库可移植.裸INSERT/UPDATE仍然可以插入非零填充数据.
用扳机处理它.优点:适用于存储过程和裸INSERT/UPDATE语句.缺点:最便携的解决方案.最慢的解决方案.触发器很难正确.
在这种情况下,我会在应用程序级别(如果有的话)处理它,而不是数据库级别.毕竟,并非所有国家/地区都使用5位数的Zipcode(甚至不是美国 - 我们的邮政编码实际上是Zip + 4 + 2:nnnnn-nnnn-nn),有些还允许使用字母和数字.最好不要试图强制数据格式并接受偶尔的数据错误,而不是阻止某人输入正确的值,即使它的格式不是您所期望的.
小智 5
我知道这是在OP之后很久了。您可以采用的一种方法是将邮政编码数据存储为无符号 INT 但显示为零的表,如下所示。
select LPAD(cast(zipcode_int as char), 5, '0') as zipcode from table;
虽然这会将原始数据保留为 INT 并且可以节省一些存储空间,但您将让服务器为您执行 INT 到 CHAR 的转换。可以将其放入视图中,并且可以将需要此数据的人定向到那里而不是表本身。