我们可以将 Varchar 用于仅保存数字的列吗

Bab*_*ase -1 mysql datatypes

我正在做一个“用户注册项目”,我是数据库设计的新手。

我研究了很多教程,但我没有得到这个问题的解决方案。

为什么没有一种特定的数据类型适用于所有人,它应该支持所有这些int、float、string、date,而不是使用 "int" 代表电话、“char”代表姓名和“varchar”代表电子邮件。

即使我确定“字段”只会存储数字如果我使用“varchar”也会有任何问题吗?

如果我们使用正确的数据类型,那么性能/优势会更好吗?如果我varchar用于只存储数字的列,那么性能会下降,对吗?

与其在未来苦苦挣扎(例如在MySQL 中,在 Stack Overflow 上将列数据类型从 VARCHAR 转换为 INT),不如使用错误的数据类型,最好只在之前使用正确的数据类型?

And*_*nan 5

没有一种包罗万象的数据类型,因为存储、工作内存和 CPU 不是无限资源。如今,您几乎应该始终将数据存储在您将对其执行最多操作的类型中。否则,您将花费大量精力在操作前将数据转换为不同类型。

您的电话号码示例是一个很好的示例。电话号码可能最好存储为字符串。它们通常是固定长度的,您永远不想对它们执行数字运算(加法、减法等)。您更有可能想要在它的开头附加一个国际拨号代码或其他东西,这对于一个号码来说是一个复杂的操作,但对一个字符串来说却是微不足道的。

这也与索引非常相关:如果您将电话号码存储为数字,并开始基于字符串进行选择,您的索引将永远不会被使用。假设您要查找来自爱尔兰的所有电话号码:

select * from phone_numbers where varchar(number) like '353%';
Run Code Online (Sandbox Code Playgroud)

如果你在 MySQL 的这个列上放置一个索引,它将始终是一个数字索引,这样的搜索将被跳过。*

最后,将电话号码存储为数字会违反 E.164 标准。从技术上讲,加号“+”字符应位于每个数字的开头。

*Oracle 允许功能性索引,并且更高版本的 MySQL 和 MariaDB 允许您创建可以由不同数据类型索引的持久虚拟列。