HOWTO · MySQL

在 MySQL 中格式化和儲存電話號碼

本教程說明了 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 資料庫中的電話號碼。

但是,根據記憶體效率和速度選擇最合適的資料型別取決於預期的資料庫應用程式。