【问题标题】:MySQL - ENUM - Good Idea for ISO 3166-1 Country Codes?MySQL - ENUM - ISO 3166-1 国家代码的好主意?
【发布时间】:2015-05-14 13:26:06
【问题描述】:

我有一个 MySQL 数据库表,用于使用 2 位 (ISO 3166-1) 国家代码(例如美国 = 美国)标记数据库中的项目。

我正在考虑在国家代码标签列中使用 ENUM,因为国家代码变化不大,大约有 200 个左右。另外,这个表最终可能会有很多行,所以我认为使用 ENUM 将有助于它有效地运行。

我听说有人在 SO 上的其他情况下使用带有国家代码的 ENUM,但我不确定在使用 MySQL 时这样做是否合理。

您认为——在我的情况下,在 MySQL 中使用 ENUM 表示两位国家/地区代码是个好主意吗?还是我会后悔这个决定?

我正在使用 MySQL 5.6 和 PHP 5.5。

【问题讨论】:

  • 我更喜欢使用单独的表格来存储国家代码。因此,将来您可以根据需要添加不同的列,例如国家/地区名称、不同语言的翻译、首都、时区或其他任何内容。但主要目标是保持简单。只有少数情况下您真的需要所有国家/地区,通常我们与其中一些国家/地区合作 1-2 用于小公司,最多 20 用于非常大的国家,但 100 个国家/地区 - 我不确定您的申请是什么,可能您真的需要它。
  • 对于我的项目,我的想法是像“文章”这样的项目几乎总是应该至少有一个与文章相关联的国家标签。有些文章可能与多个国家/地区相关联。如果文章很多,那么最终这个表会有非常多的行。 DB 中的其他项目也可能被标记。
  • CHAR(2) 没问题。在您的应用程序中处理数据验证。

标签: php mysql database enums


【解决方案1】:

ENUM 数据类型通常用于非常简单且不变的值,例如自定义布尔值(T/F、0/1、Heads/Tails)或不会像多项选择答案(A , b, C, D, E)。

如果值会发生变化,我不建议使用 ENUM 数据类型(在我们不断变化的边界世界中就是这种情况)。它要求您在需要添加或更糟时更新表架构 - 从 ENUM 值列表中删除一个值。 ENUM 数据类型非常适合那些您需要确保它只是已定义字段中的值之一,并且在尝试使用列表之外的值时需要进行错误检查的字段。

我会根据您表示国家/地区代码的方式推荐一个非常简单的可变两个字符字段(A2 ISO 或 A3 UN),一个小整数 (NUM UN)。

使用单独的查找表(加入查询)来执行代码扩展和其他相关国家数据(汇率、居住大陆等)

【讨论】:

  • 谢谢。是的,我想每次国家代码更改时都必须更新 ENUM 可能太令人讨厌,无法证明使用 ENUM 是合理的,即使它需要更少的存储空间。我猜我会选择 CHAR(2)。
  • CHAR(2) 适用于 A2 ISO,请确保您没有针对国家/地区代码的 A3 UN 规范的计划。 worldatlas.com/aatlas/ctycodes.htm
猜你喜欢
  • 2012-12-16
  • 2015-05-01
  • 2015-02-22
  • 2014-02-09
  • 2014-08-29
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
相关资源
最近更新 更多