MySQL 數據類型詳解:字符串、數字、日期

MySQL 數據類型詳解:字符串、數字、日期

在 MySQL 中,選擇合適的數據類型對于數據庫的存儲效率查詢性能至關重要。MySQL 提供了**字符串(String)、數字(Numeric)和日期(Date & Time)**三大類數據類型,每種類型又有不同的子類型,以適應不同的業務需求。


1. 字符串(String)數據類型

字符串類型用于存儲文本數據,主要分為定長(CHAR)變長(VARCHAR),以及大文本(TEXT 和 BLOB)

1.1 定長與變長字符串

數據類型存儲方式特點適用場景
CHAR(n)定長存儲(不足補空格)訪問速度快,占用空間固定適用于固定長度的數據,如國家代碼、身份證號
VARCHAR(n)變長存儲(按需分配空間)節省存儲空間,但查詢時可能需要額外的存儲開銷適用于長度不固定的文本,如用戶昵稱、電子郵件
CHAR vs. VARCHAR
  • CHAR(10) 始終占用 10 個字節(不足補空格)。
  • VARCHAR(10) 只存儲實際字符,最多 10 個字節,并額外占用 1-2 字節用于存儲長度信息。

一般來說:

  • 短小、長度固定的文本(如國家代碼、MD5 哈希)用 CHAR
  • 長度不固定的文本(如姓名、地址)用 VARCHAR

1.2 TEXT 和 BLOB

當存儲較長的文本或二進制數據時,使用 TEXT 和 BLOB 類型:

數據類型最大存儲大小是否區分大小寫適用場景
TINYTEXT255 字節? 區分大小寫短文本,如推文內容
TEXT65,535 字節(64KB)? 區分大小寫文章內容、評論
MEDIUMTEXT16,777,215 字節(16MB)? 區分大小寫書籍、日志記錄
LONGTEXT4GB? 區分大小寫超長文本,如百科條目
TINYBLOB255 字節? 不區分大小寫小二進制數據,如圖片縮略圖
BLOB64KB? 不區分大小寫圖片、音頻
MEDIUMBLOB16MB? 不區分大小寫大型媒體文件
LONGBLOB4GB? 不區分大小寫超大文件,如電影
TEXT vs. VARCHAR
  • TEXT 不支持 默認值,也無法使用 索引(僅支持前綴索引),但可以存儲大量文本。
  • VARCHAR 可以索引整個字段,適用于需要頻繁搜索的文本字段。

2. 數字(Numeric)數據類型

數字類型用于存儲整數或小數,主要分為整數類型浮點/定點類型

2.1 整數類型

數據類型存儲大小取值范圍(無符號)適用場景
TINYINT1 字節0 ~ 255布爾值(0/1)、評分
SMALLINT2 字節0 ~ 65,535小范圍數值,如年齡
MEDIUMINT3 字節0 ~ 16,777,215適用于 ID、自增字段
INT(INTEGER)4 字節0 ~ 4,294,967,295適用于大部分場景,如用戶 ID
BIGINT8 字節0 ~ 18,446,744,073,709,551,615適用于超大數值,如銀行賬戶余額

無符號(UNSIGNED) vs. 有符號

  • 默認情況下整數是有符號的(即支持負數)。
  • UNSIGNED 關鍵字可以使整數僅存儲非負數,從而擴大可用范圍。
    CREATE TABLE users (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
    );
    

2.2 浮點與定點類型

數據類型存儲大小適用場景
FLOAT(M, D)4 字節適用于非嚴格精度的計算,如游戲評分
DOUBLE(M, D)8 字節高精度計算,如科學計算
DECIMAL(M, D)(NUMERIC)可變財務計算,避免精度丟失
FLOAT vs. DECIMAL
  • FLOAT/DOUBLE 使用二進制存儲,可能導致精度誤差
    SELECT 0.1 + 0.2; -- 結果可能不是 0.3
    
  • DECIMAL 采用字符串存儲,不會丟失精度
    CREATE TABLE transactions (amount DECIMAL(10,2) NOT NULL
    );
    

建議:

  • 財務類數據使用 DECIMAL,避免計算誤差。
  • 非關鍵計算(如統計數據)可使用 FLOATDOUBLE

3. 日期與時間(Date & Time)

MySQL 提供多個日期時間類型:

數據類型存儲大小取值范圍適用場景
DATE3 字節1000-01-01 ~ 9999-12-31生日、訂單日期
DATETIME8 字節1000-01-01 00:00:00 ~ 9999-12-31 23:59:59需要精確到秒的時間,如創建時間
TIMESTAMP4 字節1970-01-01 00:00:01 ~ 2038-01-19 03:14:07適用于存儲 Unix 時間戳
TIME3 字節-838:59:59 ~ 838:59:59記錄時間間隔
YEAR1 字節1901 ~ 2155適用于年份數據
DATETIME vs. TIMESTAMP
  • TIMESTAMP 受時區影響,適合存儲事件發生時間。
  • DATETIME 不受時區影響,適合存儲固定時間。
CREATE TABLE events (event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

4. 選擇數據類型的最佳實踐

  1. 能用整數就不要用字符串(如性別可用 TINYINT)。
  2. 存儲金額、財務數據時,使用 DECIMAL 而非 FLOAT
  3. 短文本(<255 字符)用 VARCHAR,長文本用 TEXT
  4. 索引字段盡量避免 TEXTBLOB,影響查詢性能
  5. 時間戳數據盡量使用 TIMESTAMP 代替 DATETIME,節省存儲空間

總結

MySQL 提供了多種數據類型,每種類型都有其適用場景。合理選擇數據類型可以提升存儲效率、優化查詢性能,并避免精度損失。希望這篇文章能幫助你在數據庫設計時做出更好的選擇!🚀

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

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

相關文章

題解:P2485 [SDOI2011] 計算器

### 思路 本題是一個比較模板化的題目。 #### 一操作 考慮使用快速冪。 快速冪&#xff0c;只需要把 $k$ 變成二進制即可實現 $\Theta(\log k)$ 的時間復雜度。 實現方法&#xff1a; cpp long long qmi(long long a,long long k,long long p){ long long res 1; …

重新構想E-E-A-T:提升銷售與搜索可見性的SEO策略

在2025年的數字營銷環境中&#xff0c;谷歌的E-E-A-T&#xff08;經驗、專業性、權威性、可信度&#xff09;已成為SEO和內容營銷的核心支柱。傳統的E-E-A-T優化方法通常聚焦于展示作者資質或獲取反向鏈接&#xff0c;但這些策略可能不足以應對AI驅動的搜索和日益挑剔的用戶需求…

JVM 一文詳解

目錄 JVM 簡介 JVM 中的內存區域劃分 1. 堆&#xff08;一個進程只有一份 ------ 線程共享&#xff09; 2. 棧&#xff08;一個進程可以有 N 份 ------ 線程私有&#xff09; Java 虛擬機棧&#xff1a; 本機方法棧&#xff1a; 3. 程序計數器&#xff08;一個線程可以…

小程序與快應用:中國移動互聯網的漸進式革命——卓伊凡的技術演進觀

小程序與快應用&#xff1a;中國移動互聯網的漸進式革命——卓伊凡的技術演進觀 在知乎看到很多&#xff1a;“懂王”發布的要把內行笑瘋了的評論&#xff0c;卓伊凡必須懟一下&#xff0c;真印證那句話&#xff0c;無知者無畏 一、Web與小程序的技術本質差異 1.1 瀏覽器渲染…

[SC]SystemC在GPU/CPU SoC驗證中的應用案例

SystemC在GPU/CPU SoC驗證中的應用案例 摘要:SystemC 是一種基于 C++ 的系統級建模語言,廣泛用于 SoC (System on Chip) 設計的建模和驗證,尤其在 GPU SoC 驗證中,SystemC 可用于模擬硬件模塊、系統行為和性能評估。SystemC 的主要優勢在于支持系統級抽象建模、時序…

Java 網絡安全新技術:構建面向未來的防御體系

一、Java 安全架構的演進與挑戰 1.1 傳統安全模型的局限性 Java 平臺自 1995 年誕生以來&#xff0c;安全機制經歷了從安全管理器&#xff08;Security Manager&#xff09;到 Java 平臺模塊系統&#xff08;JPMS&#xff09;的演進。早期的安全管理器通過沙箱模型限制不可信…

sonar-scanner在掃描JAVA項目時為什么需要感知.class文件

1 概述 SonarQube是一個靜態代碼分析工具&#xff0c;主要用于檢查源代碼的質量&#xff0c;包括代碼重復、潛在漏洞、代碼風格問題等。而SonarScanner是SonarQube的客戶端工具&#xff0c;負責將代碼進行形態分析&#xff0c;并將結果發送到SonarQube服務器。所以&#xff0c…

媒資管理之視頻管理

一:業務概述: 媒資管理這個模塊是我負責開發的,主要的管理對象是視頻,圖片,文檔等 包括文件的上傳,視頻的處理,文件的刪除 (在媒資管理界面,有個上傳視頻的按鈕,視頻是在媒資這上傳的,課程圖片是在內容管理) 上傳的圖片和視頻,會單獨存儲到搭建的分布式文件系…

Maven 實現多模塊項目依賴管理

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

nuxt項目中引入并配置 iview

安裝iview npm install iview --save注&#xff1a;想要加入其它的配置&#xff0c;可以在 nuxt.config.js 的 plugins 配置項中加入&#xff0c;同時在 plugins 文件夾下加入引入邏輯。 在nuxt.config.js文件中寫&#xff1a; {src: ~plugins/iview, ssr: true}同時新建 plugi…

BG開發者日志505:項目總體情況

1、從2024年12月中旬啟動&#xff0c;到4月底gameplay部分開發完畢&#xff0c;已經四個半月過去了。 其中大部分內容是3、4兩個月中完成的&#xff0c;量產階段。 預計6月初參加新品節&#xff0c;6月中旬發售&#xff08;比原計劃7月中旬提前一個月&#xff09;。 --------…

C++ *stream | istream / ostream / iostream 詳解

注&#xff1a;本文為 “C *stream” 相關文章合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 Understanding the Utility of Iostreams in C 理解 C 中 iostream 的用途 By Manoj Debnat…

Dagster中的Ops與Assets:數據管道構建的兩種選擇

Dagster是一個強大的數據編排平臺&#xff0c;它提供了多種工具來幫助數據工程師構建可靠的數據管道。在Dagster中&#xff0c;Ops和Assets是兩種核心概念&#xff0c;用于定義數據處理邏輯。本文將全面介紹Ops的概念、特性及其使用方法&#xff0c;特別補充了Op上下文和Op工廠…

參數包展開到初始化列表

上次寫過參數包展開和靜態斷言的使用——Accumulator-CSDN博客&#xff0c;數組是靜態定義的&#xff0c;并且遞歸展開參數包。這里改用動態數組&#xff0c;并且將參數包展開到初始化列表中&#xff0c;成為一個動態數組。 #include <stdio.h> #include <vector>…

React18組件通信與插槽

1、為DOM組件設置Props 在react中jsx中的標簽屬性被稱為Props DOM組件的類屬性&#xff0c;為了防止與js中的class屬性沖突改成了className DOM組件的style屬性 import image from "./logo.svg"; function App() {const imgStyleObj {width: 200,height: 200,};re…

GTS-400 系列運動控制器板(十四)----軟限位使用

運動控制器函數庫的使用 運動控制器驅動程序、dll 文件、例程、Demo 等相關文件請通過固高科技官網下載,網 址為:www.googoltech.com.cn/pro_view-3.html 1 Windows 系統下動態鏈接庫的使用 在 Windows 系統下使用運動控制器,首先要安裝驅動程序。在安裝前需要提前下載運動…

C++ 開發指針問題:E0158 表達式必須為左值或函數指示符

問題與處理策略 問題描述 int* ptr &10;執行上述代碼&#xff0c;報如下錯誤 E0158 表達式必須為左值或函數指示符 C2101 常量上的“&”問題原因 10 是一個字面常量&#xff0c;常量是臨時值&#xff0c;編譯器不會為它們分配可尋址的內存空間 & 取地址運算符…

前端面經-VUE3篇(二)--vue3組件知識(二)依賴注入、異步組件、生命周期、組合式函數、插件

目錄 一、依賴注入 1、 依賴注入是什么&#xff1f; 2、最基礎的使用 3、為什么使用依賴注入&#xff1f; 4、 使用 Symbol 作注入名 二、異步組件 1、什么是異步組件&#xff1f; 2、最基礎用法&#xff1a;defineAsyncComponent 3、在模板中使用異步組件 4、配置加載狀態…

頭歌數據庫課程實驗(索引與數據庫完整性)

第1關&#xff1a;創建一般索引 任務描述 本關任務&#xff1a;為 student 表按姓名升序建立索引&#xff0c;索引名為 idx_sname。 相關知識 為了完成本關任務&#xff0c;你需要掌握&#xff1a; 索引是什么&#xff1b; 索引的分類&#xff1b; 索引的創建和刪除&#…

Socket 編程 UDP

Socket 編程 UDP UDP 網絡編程V1 版本 - echo serverV2 版本 - DictServerV3 版本 - 簡單聊天室 補充參考內容地址轉換函數關于 inet_ntoa UDP 網絡編程 聲明&#xff1a;下面代碼的驗證都是用Windows作為客戶端的&#xff0c;如果你有兩臺云服務器可以直接粘貼我在Linux下的客…