MySQL 伺服器與資料型別

最後更新: 2021-01-06 12:27:16 +0800 +0800
tags: Mysql | Sql | Databases
原文以英文撰寫。您正在閱讀AI翻譯版本。

MySQL 將伺服器初始化、結構描述定義與連線設定分開。正式環境安裝應只初始化一次空的資料目錄,將設定儲存在該目錄之外,並透過平台服務管理員管理伺服器。mysqld --initialize 會建立資料字典與初始管理帳戶,但不會設定應用程式結構描述或權限。

帳戶、授權與角色 #

MySQL 同時根據使用者與主機識別帳戶,因此 'app'@'localhost' 與 'app'@'10.%' 是不同的身分。建立帳戶時應明確指定驗證原則:

sql
CREATE USER IF NOT EXISTS 'app'@'localhost'
  IDENTIFIED WITH caching_sha2_password BY 'generated-secret';

在 MySQL 8 中,CREATE USER 會建立身分,而 GRANT 會指派權限;GRANT 不會建立帳戶。主機比對會在驗證之前進行,之後由角色與直接授予的權限決定授權結果。使用 SHOW GRANTS 檢查有效權限。角色會將權限分組,以便在多個帳戶之間重複使用:

sql
CREATE ROLE 'order_reader';
GRANT SELECT ON app.orders TO 'order_reader';
GRANT 'order_reader' TO 'app'@'localhost';
SET DEFAULT ROLE 'order_reader' TO 'app'@'localhost';

將帳戶管理置於應用程式移轉資料表之外。應用程式結構描述不應依賴臨時的權限變更來維持有效。

數值型別 #

應根據取值範圍而非顯示寬度選擇整數型別。TINYINT、SMALLINT、MEDIUMINT、INT 與 BIGINT 分別使用 1、2、3、4 與 8 位元組。無號型別會將範圍調整為非負值,但會產生跨資料庫可攜性的疑慮。BOOLEAN 與 BOOL 是 TINYINT(1) 的別名。

對於貨幣等需要十進位運算的數量,請使用 DECIMAL(p, s)。p 是十進位總位數,s 是小數點後的位數。FLOAT 與 DOUBLE 代表二進位浮點值,可能會對十進位小數進行捨入;請勿將其用於對相等性敏感的貨幣值。

時間型別與結構化值 #

  • DATE 儲存日曆日期;TIME 儲存時間或持續時間。
  • DATETIME 儲存字面日期與時間,不進行時區轉換。
  • TIMESTAMP 以時間瞬間儲存,並針對支援的值在工作階段時區與 UTC 之間轉換。
  • JSON 會驗證 JSON 並提供 JSON 函式,但其中的值不能取代用於聯結與索引的關聯式欄位。

當值表示本地預約時,請使用 DATETIME 加上明確的業務時區。對於事件發生的時間瞬間,請使用 UTC TIMESTAMP 或 UTC DATETIME,並明確定義應用程式進行轉換的邊界。

時間欄位可以宣告 0 到 6 位的小數秒精度,例如 DATETIME(6)。嚴格 SQL 模式應拒絕無效日期;控制零日期的模式與版本有關,因此結構描述不應使用 '0000-00-00' 作為缺少值的標記。請改用 NULL 或明確的狀態。

文字、二進位、JSON 與空間值 #

CHAR 與 VARCHAR 儲存透過字元集與定序解讀的字串。BINARY 與 VARBINARY 儲存位元組字串,而 TEXT 與 BLOB 系列提供較大的字元值與二進位值。索引寬度以位元組計算,因此 utf8mb4 索引鍵消耗的索引空間可能超出其字元數所暗示的大小。

MySQL 以二進位格式儲存 JSON,並公開路徑、擷取、變更與驗證函式。請透過產生欄位或支援的函式索引,為經常查詢的純量路徑建立索引。POINT、LINESTRING 與 POLYGON 等空間型別承載幾何資料;當地理意義很重要時,請宣告並驗證空間參考系統。

結構描述檢查與限制 #

使用 SHOW CREATE TABLE 檢查資料表的有效 DDL,並使用 INFORMATION_SCHEMA 執行可攜式的中繼資料查詢:

sql
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'app' AND table_name = 'orders'
ORDER BY ordinal_position;

儲存限制取決於儲存引擎、頁面大小、資料列格式、字元集與 MySQL 發行版本。SHOW ENGINES、SHOW TABLE STATUS 與 SHOW CREATE TABLE 可顯示有效的引擎與資料表屬性。請驗證已部署版本的資料列與索引限制,而不要將固定假設編碼到結構描述產生器中。相關設計細節請參閱 MySQL 字串型別與字元集、MySQL 索引 以及 MySQL 資料表與檢視。

參考資料 #

評論

在 GitHub 上閱讀或評論(發表評論需要登入)