繁体   English   中英

MySQL 中的 char(2) 或 enum 或 tinyint

[英]char(2) or enum or tinyint in MySQL

我将 CountryCode 存储在我的数据库中,我只有 5 个选项可以存储在 CountryCode "EG, AE, BH, QA, KW" 列中我应该使用 char(2) 还是 tinyint 或 enum('EG', 'AE', ' BH','QA','KW')为什么?

如果你很确定接受值的列表不会增加太多,我会用枚举 go 来获得更干净的值,避免像'Bh''eg''kW'之类的错误输入。

使用 2 个字母的标准国家/地区代码。

并将其CHAR(2) CHARACTER SET ascii 以及 ascii_bin (不允许大小写折叠)和 ascii_general_ci (用于大小写折叠)之间的争论。

那将是2个字节。

ENUMTINYINT UNSIGNED将只有一个字节,但国家的总数危险地接近 256。此时您将需要一个 2 字节的ENUMSMALLINT

支持CHAR(2)的一个论点:它是人类可读的(大部分)。 而且,如果您需要有关每个国家/地区的更多信息(全名、人口等),您仍然可以拥有一张带有PRIMARY KEY(country_code)的表,并在需要时轻松(有效地) JOIN

您的 5 cc 清单太长,太可能更改; 不要使用ENUM

一般来说, ENUM应该限制在不太可能改变的非常短的列表中。 此外,请考虑使用类似'unknown'的内容开始列表,而不是使字段NULLable

ENUM很好,但在维护方面有缺点:

  • 列出允许的值需要访问表的定义

  • 向列表中添加新的可能值需要修改表的结构

  • 如果多个表有CountryCode列,则需要重新创建另一个ENUM

所以这应该只在列表不打算随时间改变的情况下使用,并且单个列使用它。

在所有其他情况下,拥有一个存储值的引用表并在引用表中创建外键会更简单:

-- referential table
create table countries (countryCode varchar(2) primary key);
insert into countries values ('EG'), ('AE'), ('BH'), ('KW');

-- referencing table
create table mytable (
    id int, -- and/or other columns of the table ...
    countryCode varchar(2) references countries(countryCode)
);

使用这种技术,您可以获得外键的全部好处和灵活性:易于维护、数据完整性、可能的索引、不错的选项(例如on delete cascade等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM