MySQL 數據類型全面指南:詳細說明與關鍵注意事項

MySQL 數據類型全面指南:詳細說明與關鍵注意事項

MySQL 提供了豐富的數據類型,合理選擇對數據庫性能、存儲效率和數據準確性至關重要。以下是所有數據類型的詳細說明及使用注意事項:


一、數值類型

整數類型
類型字節有符號范圍無符號范圍說明
TINYINT1-128 ~ 1270 ~ 255小整數(如狀態值)
SMALLINT2-32,768 ~ 32,7670 ~ 65,535較小整數
MEDIUMINT3-8M ~ 8M-10 ~ 16M-1中等整數
INT4-2.1B ~ 2.1B-10 ~ 4.2B-1標準整數(最常用)
BIGINT8-9.2E18 ~ 9.2E18-10 ~ 1.8E19-1大整數(如主鍵ID)

注意事項

  1. 優先選擇能滿足需求的最小類型(TINYINT > SMALLINT > INT > BIGINT
  2. 無符號整數用 UNSIGNED 關鍵字:INT UNSIGNED
  3. ZEROFILL 自動添加 UNSIGNED 并用0填充:INT(5) ZEROFILL
  4. 顯示寬度(如INT(11))僅影響顯示,不影響存儲大小
浮點數類型
類型字節說明
FLOAT4單精度浮點數,約7位精度
DOUBLE8雙精度浮點數,約15位精度
DECIMAL變長精確小數(財務計算首選)

語法

DECIMAL(M, D)  -- M=總位數(1-65), D=小數位數(0-30)

注意事項

  1. FLOAT/DOUBLE 有精度損失風險,財務計算必須用 DECIMAL
    -- 錯誤示例
    FLOAT: 0.1 + 0.2 = 0.30000001192092896-- 正確方案
    DECIMAL(10,2): 0.1 + 0.2 = 0.30
    
  2. DECIMAL(5,2) 范圍:-999.99 ~ 999.99
  3. 存儲空間計算:CEILING(M/9)*4 字節(如 DECIMAL(20,6) 占9字節)

二、日期時間類型

類型格式范圍字節說明
DATE‘YYYY-MM-DD’‘1000-01-01’ ~ ‘9999-12-31’3日期值
TIME‘HH:MM:SS[.fraction]’‘-838:59:59’ ~ ‘838:59:59’3時間值(可含毫秒)
DATETIME‘YYYY-MM-DD HH:MM:SS’‘1000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59’5-8日期+時間(推薦使用
TIMESTAMP‘YYYY-MM-DD HH:MM:SS’‘1970-01-01 00:00:01’ UTC ~ ‘2038-01-19 03:14:07’ UTC4時間戳(自動轉換時區)
YEARYYYY1901 ~ 21551年份值

注意事項

  1. TIMESTAMP2038年問題:最大到 2038-01-19,新系統建議用 DATETIME
  2. 時區處理:
    • TIMESTAMP 存 UTC 時間,檢索時轉當前時區
    • DATETIME 按字面值存儲,不轉換時區
  3. 默認值和自動更新:
    -- 自動設置創建時間
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,-- 自動更新修改時間
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    
  4. 存儲空間優化:
    • 只需要日期用 DATE (3字節)
    • 只需要時間用 TIME (3字節)

三、字符串類型

定長字符串
類型最大長度特點
CHAR(n)255字符固定長度,空格填充,檢索快

適用場景:固定長度數據(MD5、國家代碼、郵編)

變長字符串
類型最大長度特點
VARCHAR(n)65,535字節按需存儲,節省空間

注意事項

  1. n 表示字符數而非字節數(UTF8MB4 中 1字符=4字節)
  2. 實際存儲空間 = 字符數 × 字符集字節 + 長度前綴(1-2字節)
  3. 最大長度限制:
    -- UTF8MB4下實際最大字符數
    65,535 / 416,383 字符
    
文本類型
類型最大長度特點
TINYTEXT255字節短文本
TEXT64KB (65,535字節)標準文本(文章內容)
MEDIUMTEXT16MB較大文本(書籍章節)
LONGTEXT4GB超大文本(整個文檔)

注意事項

  1. VARCHAR 區別:
    • TEXT 類型不能有默認值
    • 排序使用磁盤臨時表,VARCHAR 優先用內存
  2. 使用建議:
    • < 255字符:VARCHAR
    • 255字符~64KB:TEXT
    • 64KB:MEDIUMTEXT/LONGTEXT


四、二進制數據類型

二進制字符串
類型說明
BINARY(n)定長二進制(最大255字節)
VARBINARY(n)變長二進制(最大65,535字節)

適用場景:加密數據、哈希值

二進制大對象(BLOB)
類型最大長度說明
TINYBLOB255字節小二進制對象
BLOB64KB標準二進制對象
MEDIUMBLOB16MB中等二進制對象
LONGBLOB4GB超大二進制對象

注意事項

  1. TEXT 類型區別:
    • BLOB 存儲二進制數據(如圖片、PDF)
    • TEXT 存儲字符數據
  2. 性能影響:大 BLOB 會顯著增加 I/O 負載

五、枚舉與集合類型

枚舉類型 (ENUM)
gender ENUM('Male', 'Female', 'Other')
  • 特點:單選值,內部存儲為整數(1-2字節)
  • 注意事項
    • 避免超過 65,535 個選項
    • 插入非列表值會報錯(嚴格模式)或存空字符串
集合類型 (SET)
permissions SET('Read', 'Write', 'Delete', 'Admin')
  • 特點:多選值,按位存儲(1-8字節)
  • 注意事項
    • 最大64個選項
    • 查詢用 FIND_IN_SET()WHERE FIND_IN_SET('Write', permissions)

六、JSON 類型 (MySQL 5.7+)

user_profile JSON

操作示例

-- 插入
INSERT INTO users VALUES ('{"name": "John", "age": 30}');-- 查詢
SELECT user_profile->>"$.name" FROM users;-- 更新
UPDATE users SET user_profile = JSON_SET(user_profile, '$.age', 31);

注意事項

  1. 優勢:
    • 自動驗證JSON格式
    • 高效讀取(無需解析整個文檔)
  2. 限制:
    • 最大大小同 LONGTEXT (4GB)
    • 不支持直接索引(需生成列+索引)

數據類型選擇最佳實踐

  1. 精確數值計算
    ? 用 DECIMAL
    ? 避免 FLOAT/DOUBLE

  2. 時間存儲
    ? 用 DATETIME(無2038限制)
    ? 避免 TIMESTAMP 長期存儲

  3. 字符串優化
    ? 定長用 CHAR(如 UUID、MD5)
    ? 變長用 VARCHAR(<255字符)
    ? 大文本用 TEXT

  4. 存儲空間敏感場景

    • 小整數:TINYINT UNSIGNED(1字節)
    • 狀態值:ENUM(1-2字節)
    • 日期:DATE(3字節)
  5. 性能關鍵點

    • CHAR vs VARCHAR:定長字段 CHAR 檢索更快
    • TEXT/BLOB:避免 SELECT *,單獨存儲大字段
    • 整型索引比字符型快

常見錯誤案例

錯誤1:用 VARCHAR 存數字

-- 錯誤:數字比較需隱式轉換
SELECT * FROM products WHERE product_id = 100; -- 優化:改為 INT
ALTER TABLE products MODIFY product_id INT;

錯誤2:日期范圍查詢

-- 錯誤:字符串比較低效
SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';-- 優化:用日期函數
SELECT * FROM orders 
WHERE order_date >= '2023-01-01' AND order_date < '2023-02-01';

錯誤3:ENUM 濫用

-- 錯誤:選項過多
color ENUM('red','green','blue', ... 100+ colors);-- 優化:改用關聯表
CREATE TABLE colors (id TINYINT, name VARCHAR(20));

合理選擇數據類型是數據庫優化的基礎,需結合業務需求、存儲成本和性能要求綜合決策。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912291.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912291.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912291.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode437-路徑總和III

leetcode 437 思路 利用前綴和hash map解答 前綴和在這里的含義是&#xff1a;從根節點到當前節點的路徑上所有節點值的總和 我們使用一個 Map 數據結構來記錄這些前綴和及其出現的次數 具體思路如下&#xff1a; 初始化&#xff1a;創建一個 Map &#xff0c;并將前綴和 …

UI前端與數字孿生融合探索新領域:智慧家居的可視化設計與實現

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言&#xff1a;智慧家居的數字化轉型浪潮 在物聯網與人工智能技術的推動下&#xff0c…

數據結構知識點總結--緒論

1.1 數據結構的基本概念 1.1.1 基本概念和術語 主要涉及概念有&#xff1a; 數據、數據元素、數據對象、數據類型、數據結構 #mermaid-svg-uyyvX6J6ofC9rFSB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uyyvX6…

pip install mathutils 安裝 Blender 的 mathutils 模塊時,編譯失敗了

你遇到的問題是因為你試圖通過 pip install mathutils 安裝 Blender 的 mathutils 模塊時&#xff0c;編譯失敗了&#xff0c;主要原因是&#xff1a; 2018年 的老版本也不行 pip install mathutils2.79 ? 報錯核心總結&#xff1a; 缺失頭文件 BLI_path_util.h&#xff1a;…

編譯安裝交叉工具鏈 riscv-gnu-toolchain

參考鏈接&#xff1a; https://zhuanlan.zhihu.com/p/258394849 1&#xff0c;下載源碼 git clone https://gitee.com/mirrors/riscv-gnu-toolchain 2&#xff0c;進入目錄 cd riscv-gnu-toolchain 3&#xff0c;去掉qemu git rm qemu 4&#xff0c;初始化 git submodule…

復制 生成二維碼

一、安裝插件 1、復制 npm install -g copy-to-clipboard import copy from copy-to-clipboard; 2、生成二維碼 & 下載 npm install -g qrcode import QRCode from qrcode.react; 二、功能&#xff1a;生成二維碼 & 下載 效果圖 1、常規使用&#xff08;下載圖片模糊…

自由職業的經營視角

“領導力的核心是幫助他人看到自己看不到的東西。” — 彼得圣吉 最近與一些自由職業者的交流中&#xff0c;發現很多專業人士都會從專業視角來做交流&#xff0c;這也讓我更加理解我們海外戰略顧問莊老師在每月輔導時的提醒——經營者視角和專業人士視角的不同。這不僅讓大家獲…

MR30分布式 IO在物流堆垛機的應用

在現代物流行業蓬勃發展的浪潮中&#xff0c;物流堆垛機作為自動化倉儲系統的核心設備&#xff0c;承擔著貨物的高效存取與搬運任務。它憑借自動化操作、高精度定位等優勢&#xff0c;極大地提升了倉儲空間利用率和貨物周轉效率。然而&#xff0c;隨著物流行業的高速發展&#…

告別固定密鑰!在單一賬戶下用 Cognito 實現 AWS CLI 的 MFA 單點登錄

大家好&#xff0c;很多朋友&#xff0c;特別是通過合作伙伴或服務商使用 AWS 的同學&#xff0c;可能會發現自己的 IAM Identity Center 功能受限&#xff0c;無法像在組織管理賬戶里那樣輕松配置 CLI 的 SSO (aws configure sso)。那么&#xff0c;我們就要放棄治療&#xff…

未來機器視覺軟件將更注重成本控制,邊緣性能,魯棒性、多平臺支持、模塊優化與性能提升,最新版本opencv-4.11.0更新了什么

OpenCV 4.11.0 作為 4.10.0 的后續版本,雖然沒有在提供的搜索結果中直接列出詳細更新內容,但結合 OpenCV 4.10.0 的重大改進方向(發布于 2024 年 6 月),可以合理推斷 4.11.0 版本可能延續了對多平臺支持、模塊優化和性能提升的強化。以下是基于 OpenCV 近期更新模式的推測…

小程序入門:數據請求全解析

在微信小程序開發中&#xff0c;數據請求是實現豐富功能的關鍵環節。本文將帶你深入了解小程序數據請求的相關知識&#xff0c;包括請求限制、配置方法以及不同請求方式的實現&#xff0c;還會介紹如何在頁面加載時自動請求數據&#xff0c;同時附上詳細代碼示例&#xff0c;讓…

開源版gpt4o 多模態MiniGPT-4 實現原理詳解

MiniGPT-4是開源的GPT-4的平民版。本文用帶你快速掌握多模態大模型MiniGPT-4的模型架構、訓練秘訣、實戰亮點與改進方向。 1 模型架構全景&#xff1a;三層協同 &#x1f4ca; 模型底部實際輸入圖像&#xff0c;經 ViT Q-Former 編碼。藍色方塊 (視覺編碼器)&#xff1a;左側…

Flutter基礎(控制器)

第1步&#xff1a;找個遙控器&#xff08;創建控制器&#xff09;? // 就像買新遙控器要裝電池 TextEditingController myController TextEditingController(); ??第2步&#xff1a;連上你的玩具&#xff08;綁定到組件&#xff09;?? TextField(controller: myContro…

Spring Boot使用Redis常用場景

Spring Boot使用Redis常用場景 一、概述&#xff1a;Redis 是什么&#xff1f;為什么要用它&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一個內存中的數據存儲系統&#xff08;類似一個“超級大字典”&#xff09;&#xff0c;它能存各種類型的數據…

CAD文件處理控件Aspose.CAD教程:在 C# 中將 DXF 文件轉換為 SVG - AutoCAD C# 示例

概述 使用 C# 輕松將DXF文件轉換為SVG。此轉換可更好地兼容 Web 應用程序&#xff0c;并增強 CAD 圖紙的視覺呈現效果。使用Aspose.CAD for .NET &#xff0c;開發人員可以輕松實現此轉換過程。該 SDK 提供強大的功能&#xff0c;使其成為 C# 開發人員的可靠選擇。Aspose.CAD …

Gitee 持續集成與交付(CI/CD)篇

Gitee 持續集成與交付&#xff08;CI/CD&#xff09;篇 &#x1f680; 文章目錄 Gitee 持續集成與交付&#xff08;CI/CD&#xff09;篇 &#x1f680;&#x1f3af; 什么是 CI/CD&#xff1f;&#x1f31f; Gitee Go 介紹? 核心特性&#x1f3a8; 支持的技術棧 &#x1f680;…

深度學習:PyTorch卷積神經網絡圖像分類案例分享

本文目錄&#xff1a; 一、了解CIFAR-10數據集二、案例之導包三、案例之創建數據集四、案例之搭建神經網絡&#xff08;模型構建&#xff09;五、案例之編寫訓練函數&#xff08;訓練模型&#xff09;六、案例之編寫預測函數&#xff08;模型測試&#xff09; 前言&#xff1a;…

記錄多功能按鍵第二種寫法使用定時器周期間隔判斷.

邏輯是通過定時器溢出周期進行判斷按下次數 比如設置定時器溢出周期為500MS,每次溢出都會判斷按鍵按下次數,如果下個周期前沒有觸發按下,則結束鍵值判斷.并確定觸發鍵值.清空按下次數標志.測試比一個定時器周期按下按鍵次數判斷寫法要穩定... 記錄STM32實現多功能按鍵_stm32一…

【安卓Sensor框架-1】SensorService 的啟動流程

內核啟動后&#xff0c;首個用戶空間進程init&#xff08;pid1&#xff09;解析init.rc配置文件&#xff0c;啟動關鍵服務&#xff08;如Zygote和ServiceManager&#xff09;。 Zygote服務配置為/system/bin/app_process --zygote --start-system-server&#xff0c;后續用于孵…

centos網卡綁定參考

同事整理分享&#xff1a; 1. 加載 Bonding 模塊 modprobe bonding 獲取網卡名稱 ip a 找到接了網線的網卡名稱&#xff0c;記下。 3. 配置物理網卡 創建并編輯 /etc/sysconfig/network-scripts/ifcfg-ens36&#xff08;ifcfg-后面的內容根據上面找到的具體網卡名稱決定&#…