1

我正在尝试构建一个包含邮政编码数据的数据库表(稍后在我的应用程序中引用)。

我从http://www.populardata.com/zipcode_database.html.csv获取文件,其中包含以下数据:

  • 压缩
  • 纬度
  • 经度
  • 城市
  • 状态
  • zip_class

到目前为止,我尝试的是:

CREATE TABLE `finder_zip_codes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `zip` mediumint(128) DEFAULT '0',
  `latitude` varchar(128) DEFAULT NULL,
  `longitude` varchar(128) DEFAULT NULL,
  `city` varchar(128) DEFAULT NULL,
  `state` varchar(128) DEFAULT NULL,
  `county` varchar(128) DEFAULT NULL,
  `zip_class` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

但是由于我对 MySQL 比较陌生,因此最佳实践等已经悄悄出现在我身上。例如,该zip表似乎去掉了邮政编码的开头。我调查了ZEROFILL但我不认为这是我想要的,我基本上想zip用作一个 int 字段,但它不会自动更正其中的数据(或截断它)。

任何帮助将不胜感激 - 我一直在尝试一些文档网站,这是我迄今为止提出的 - 所以任何额外的提示都会很棒。谢谢!

4

4 回答 4

3

您可能不想将邮政编码存储为整数字段,因为它不是真正的整数。它看起来像一个,但对其执行整数运算是没有意义的(例如,你永远不会这样做12034 + 32523——这将是荒谬的)。

最好将它存储为一个char(5)字段,因为它确实是这样的 - 一个 5 个字符的字符串,恰好被限制为仅包含数字。

编辑

Latitude并且Longitude可以存储为数字数据类型(可能是小数或双精度),因为它们实际上数字:)

于 2012-11-19T16:07:01.810 回答
1

整数的存储方式与数字相同。最有可能的是,它不是“剥离”——您用来查看表格的界面正在删除前导零以使其对人类友好。

同样,当您在屏幕或报告上生成它时,您也应该用零填充。

于 2012-11-19T16:09:26.423 回答
0

我们经常收到这个问题,因为我们出售邮政编码数据。默认情况下,Microsoft 产品会去掉前导零,波多黎各、新英格兰和新泽西州邮政编码的部分地区有一个或多个前导零。我见过的最好的 SQL 方法是使用:RIGHT(100000 + zip, 5)。

这也适用于墨西哥邮政编码和您想要前导零的任何整数。您只需更改逗号后的零数和整数表达式。例如,如果您需要一个 6 位数的支票号码字段以具有前导零,您将拥有: RIGHT(1000000 + check_num, 6)

于 2014-01-08T17:17:23.703 回答
0

看来您正在限制美国的邮政编码。您可能还想考虑外国邮政编码。在这种情况下,您需要重新构建数据库架构以包含国家/地区。这将需要多个表(规范化)在表之间具有外键关联。示例:country_id 和 state_id。

此外,不同国家/地区的邮政编码格式似乎有所不同。参考:http ://en.wikipedia.org/wiki/List_of_postal_codes 。

我建议您为表名提供一个更有意义的名称,而不是 finder_zip_codes。我们通常不使用复数形式的表名(去掉结尾的 's')。另外,表名应该是名词,“finder”表示动词。更好的名称是 usa_zip_code。

此外,主键通常是表的名称,后跟“id”。示例:usa_zip_code_id。这样,当您在另一个表中有 usa_zip_code_id 作为外键时,您会立即知道它指的是哪个表。最后,考虑哪些列不应该为空,和/或唯一。

于 2014-01-08T19:13:45.207 回答