在 MySQL 中格式化和存储电话号码

Victor A. Oguntuase 2023年10月8日
  1. 了解 MySQL 数据类型
  2. 在 MySQL 中使用 CHAR 存储电话号码
  3. 在 MySQL 中使用 TINYTEXT 存储电话号码
  4. 在 MySQL 中使用 VARCHAR 存储电话号码
在 MySQL 中格式化和存储电话号码

MySQL 提供了各种方便的数据类型,用于将预期输入存储到其数据库中。了解用于存储特殊数据的正确数据类型是确保优化和高效数据库的关键。

本教程说明了 MySQL 数据库中电话号码的格式和存储。

了解 MySQL 数据类型

MySQL 一般具有三种数据类型:

  1. 数字(INTBITFLOAT 等)
  2. 字符串(CHARVARCHARTEXT 等)
  3. 日期和时间(DATEDATETIMETIMESTAMP 等)

这些通用数据类型还具有用于数据库中数据处理的特定情况的子类型。

查看来自 w3schools) 的关于各种 RDBMS(关系数据库管理系统)数据类型的参考资料,以供进一步阅读。

在处理电话号码时,可能会很快考虑使用数字数据类型。但是,由于电话号码采用各种格式(国家代码、分隔符等)并具有特殊字符,因此可能会出现问题。

由于电话号码的长度最多为十五 (15) 位,根据国际电信联盟,字符串类型 CHARVARCHARTINYTEXT 是最佳考虑因素。

CHARTINYTEXT 的上限为两百五十五 (255) 个字符,而 VARCHAR 使用动态内存分配来存储数据,上限为 0 到 65535 之间的定义限制。

让我们以每种数据类型的电话号码存储为例来确定最合适的选择。

在 MySQL 中使用 CHAR 存储电话号码

CHAR 数据类型(字符的缩写)可以存储 0 到 255 个字符之间的固定长度字符串。实现 CHAR 的列可以指定 0 到 255 之间的上限约束,并且 MySQL 期望该列中的每个字符串具有相同的大小。

当输入比指定约束更短的字符串时,MySQL 用空格填充剩余的空间。

例如,如果表列指定 CHAR 数据类型,其大小约束为三十个字符 (30),则传递 10 个字符的值仍会占用 30 个字符的空间(10 个数据字符和 20 个空格)。

可以通过这个 MySQL 官方文档对此进行进一步的讨论。

为了说明,让我们创建一个示例注册系统数据库。

-- Initializing
CREATE DATABASE new_registration_db;
USE new_registration_db;

-- CREATING TABLES
CREATE TABLE registered_users (
	id INT AUTO_INCREMENT,
    username VARCHAR (255) NOT NULL,
    email VARCHAR(255),
    phone CHAR (15) NOT NULL,
    PRIMARY KEY(id)
);

-- POPULATING THE TABLE WITH SAMPLE REGISTRATION DATA
INSERT INTO registered_users(username, email, phone) Values
	('Mark Laurent', 'MarkRLaurent@teleworm.us','+1 908-204-0495'),
    ('Patricia Todd', 'PatriciaJTodd@teleworm.us','+1 801-752-2367'),
    ('Victoria McDonald', 'VictoriaAMcDonald@dayrep.com', '+1 608-299-8640'),
	('Vin Petrol', 'vin_not_diesel@crudemail.com','+1 870-381-6967');

输出:

1 row(s) affected
0 row(s) affected
0 row(s) affected
4 row(s) affected Records: 4  Duplicates: 0  Warnings: 0

现在,让我们预览结果表。

SELECT * FROM registered_users;    -- Checking the table

输出:

id	username			email							phone
1	Mark Laurent		MarkRLaurent@teleworm.us		+1 908-204-0495
2	Patricia Todd		PatriciaJTodd@teleworm.us		+1 801-752-2367
3	Victoria McDonald	VictoriaAMcDonald@dayrep.com	+1 608-299-8640
4	Vin Petrol			vin_not_diesel@crudemail.com	+1 870-381-6967
-----------------------------------------------------------------------------------------
4 row(s) returned

在这里,由于电话号码的长度固定为 15 个字符,因此 CHAR 数据类型将提供有效的存储。此外,它可用于过滤目的的索引。

但是,CHAR 数据类型可能无法有效地管理使用可变大小电话号码的应用程序(全局应用程序)的内存,因为如前所述,由于填充了空格。

在 MySQL 中使用 TINYTEXT 存储电话号码

TINYTEXT 数据类型是最小的 TEXT 类型数据类型。它与 0 到 255 个字符之间的 CHAR 数据类型具有相同的内存限制。

但是,与 CHAR 不同,它可以根据其字符长度为传递的值动态分配空间。因此,对于这个存储电话号码的示例,它提供了比 CHAR 更好的内存效率。

它确实具有没有默认值的缺点,使其不可索引以进行排序或聚合。

现在,让我们使用 TINYTEXT 重做前面的示例。

-- CREATING TABLES
CREATE TABLE registered_users2 (
	id INT AUTO_INCREMENT,
    username VARCHAR (255) NOT NULL,
    email VARCHAR(255),
    phone TINYTEXT NOT NULL,
    PRIMARY KEY(id)
);

-- POPULATING THE TABLE WITH SAMPLE REGISTRATION DATA
INSERT INTO registered_users2(username, email, phone) Values
	('Mark Laurent', 'MarkRLaurent@teleworm.us','+1 908-204-0495'),
    ('Patricia Todd', 'PatriciaJTodd@teleworm.us','+1 801-752-2367'),
    ('Victoria McDonald', 'VictoriaAMcDonald@dayrep.com', '+1 608-299-8640'),
	('Vin Petrol', 'vin_not_diesel@crudemail.com','+1 870-381-6967');

SELECT * FROM registered_users2;    -- Checking the table

输出:

id	username			email							phone
1	Mark Laurent		MarkRLaurent@teleworm.us		+1 908-204-0495
2	Patricia Todd		PatriciaJTodd@teleworm.us		+1 801-752-2367
3	Victoria McDonald	VictoriaAMcDonald@dayrep.com	+1 608-299-8640
4	Vin Petrol			vin_not_diesel@crudemail.com	+1 870-381-6967
-----------------------------------------------------------------------------------------
0 row(s) affected
4 row(s) affected Records: 4  Duplicates: 0  Warnings: 0
4 row(s) returned

我们得到了预期的结果。查看此参考以获取有关 MySQL TINYTEXT 和其他 TEXT 数据类型的更多信息。

在 MySQL 中使用 VARCHAR 存储电话号码

在 MySQL 中处理电话号码的最终建议方法是使用 VARCHAR 数据类型。当电话号码长度因数据库用户而异时,VARCHAR 提供了动态内存分配的灵活性。

它通常分配两 (2) 个额外字节用于存储长度信息。因此,如果存储长度为六 (6) 的字符,则 VARCHAR 需要总共分配 8 个字节的内存。

指定 VARCHAR 数据类型的列也是可索引的,用于实现排序、聚合和主/外键约束。

让我们为电话号码分配创建第三个实现 VARCHAR 的表。

-- CREATING TABLES
CREATE TABLE registered_users3 (
	id INT AUTO_INCREMENT,
    username VARCHAR (255) NOT NULL,
    email VARCHAR(255),
    phone VARCHAR (15) NOT NULL,
    PRIMARY KEY(id)
);

-- POPULATING THE TABLE WITH SAMPLE REGISTRATION DATA
INSERT INTO registered_users3(username, email, phone) Values
	('Mark Laurent', 'MarkRLaurent@teleworm.us','+1 908-204-0495'),
    ('Patricia Todd', 'PatriciaJTodd@teleworm.us','+1 801-752-2367'),
    ('Victoria McDonald', 'VictoriaAMcDonald@dayrep.com', '+1 608-299-8640'),
	('Vin Petrol', 'vin_not_diesel@crudemail.com','+1 870-381-6967');

SELECT * FROM registered_users3;    -- Checking the table

输出:

id	username			email							phone
1	Mark Laurent		MarkRLaurent@teleworm.us		+1 908-204-0495
2	Patricia Todd		PatriciaJTodd@teleworm.us		+1 801-752-2367
3	Victoria McDonald	VictoriaAMcDonald@dayrep.com	+1 608-299-8640
4	Vin Petrol			vin_not_diesel@crudemail.com	+1 870-381-6967
-----------------------------------------------------------------------------------------
0 row(s) affected
4 row(s) affected Records: 4  Duplicates: 0  Warnings: 0
4 row(s) returned

实现上述三种数据类型中的任何一种都足以处理 MySQL 数据库中的电话号码。

但是,根据内存效率和速度选择最合适的数据类型取决于预期的数据库应用程序。

Victor A. Oguntuase avatar Victor A. Oguntuase avatar

Victor is an experienced Python Developer, Machine Learning Engineer and Technical Writer with interests across various fields of science and engineering. He is passionate about learning new technologies and skill and working on challenging problems. He enjoys teaching, intellectual discourse, and gaming, among other things.

LinkedIn GitHub