最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL全面解讀數(shù)據(jù)類型及其影響分析

 更新時間:2025年12月29日 09:39:38   作者:忘梓.  
本文詳細介紹了MySQL中的各種數(shù)據(jù)類型,包括數(shù)值類型(如tinyint、float、decimal)、字符串類型(如char、varchar)以及日期和時間類型(如date、datetime、timestamp),每個類型都有其特定的用途和存儲方式,感興趣的朋友跟隨小編一起看看吧

前言

        上篇文章小編講述了關于MySQL表的DDL操作,在那里我多次使用了MySQL的數(shù)據(jù)類型,但是我并沒有去講述MySQL的數(shù)據(jù)類型,想必各位讀者已經(jīng)很好奇MySQL的數(shù)據(jù)類型都有什么了,今天這篇文章我將會詳細的去講述MySQL的數(shù)據(jù)類型,希望可以為各位解惑。

1.數(shù)據(jù)類型以及分類

        在詳細說明每個數(shù)據(jù)類型之間,我先來讓各位看一看MySQL中有幾種數(shù)據(jù)類型以及它們的分類(只截取了比較重要的一部分,還有一些我并沒有展示出來,各位讀者感興趣可以去官方網(wǎng)站自行學習)。

        上面的類型有很多種,不過很多我們在學C語言的時候就已經(jīng)感到很熟悉了,就比如數(shù)值類型中的int類型,它就是我們在C語言學習的整型,這點MySQL和C語言還是一樣的,當然MySQL和C語言還是有差異的地方的,就比如文本類型的中的char,在C語言中,它代表的是字符類型,也就是'A'、'B'等等的字符;而它在MySQL代表的事一個固定長度的字符串,各位千萬不要把它的定義和C語言的混為一談。下面我將從數(shù)值類型、文本。二進制類型。時間日類類型以及string類型這幾個方面,詳細講述MySQL的數(shù)據(jù)類型以及它和編程語言的異同,幫各位避開這些認知陷阱。

2.數(shù)值類型

        上表就是我想要講述的數(shù)值類型,此時我先簡單的帶著各位看下這個表,這個表大多數(shù)的都是和整型int相關的,之所以放到一起是因為我認為它們是有相似性的,當我講述完其中幾個以后,剩下的類型各位就可以自己去領悟了(絕對不是因為我偷懶),下面我來分別講述一下這幾種類型。

2.1.tinyint類型

        通過上表,我們可以簡單的知道它所代表的范圍是-128到127,因為它是占據(jù)一個字節(jié),一個字節(jié)是八個比特位,所以它可以表示2^8也就是256個不同的值(從00000000到11111111);在計算機用補碼表示有符號整數(shù)時,最高位為0表示正數(shù)(0到127),最高位為1表示負數(shù)(-1到-128),其中 10000000 這個特殊編碼被定義為 -128,因此整體范圍就是 -128 到 127。因此它的范圍就是-128到127,可能有些讀者好奇它的范圍真的卡的那么嚴嗎?不要急,下面我簡單的進行范圍的測試(里面涉及到表的DML的知識,這是我下一篇文章要講述的,各位讀者可以先期待著)。

1.范圍檢測

        此時我簡單的建立一個表,這個表的名字是student,里面涉及學生的學號以及姓名(就這么簡單就好了),下面是實現(xiàn)的代碼(建議各位讀者可以自行實現(xiàn),之后再來和我的進行對照)。

create table student(
    name varchar(20) #代表的是姓名
    id tinyint
);#代表表的創(chuàng)建

插入邊界值

        此時我們可以先插入最大值試一試,因為我還沒有講述表的插入操作,所以各位知曉我的目的是把一個學生姓名為張三的,id為127;

insert into student values('張三',127);

        此時可以看出插入成功了,下面我們查詢我們插入的數(shù)據(jù)。同樣的,這涉及到表的查詢操作,我依舊不解釋。

select * from student;

        下面我們插入最小值試一下,插入一個姓名為李四,id為-128(有點奇怪)的數(shù)據(jù)。

insert into student values('李四',-128);

        此時數(shù)據(jù)依然是插入成功了,我們依舊可以查詢插入的數(shù)據(jù)。

select * from student;

插入一個不在范圍內(nèi)的值

        此時我試著插入一個姓名為小禾,id為128的數(shù)據(jù)。

insert into student values('小禾',128);

        正如我們所見,嘗試插入超出 tinyint 范圍(-128 到 127)的值導致了錯誤。這驗證了整型的一個重要規(guī)則:當插入的值超出該整型定義的數(shù)值范圍時,數(shù)據(jù)庫系統(tǒng)會報錯。 其他整型(如 smallint, int, bigint)的核心機制與此完全相同,區(qū)別僅在于它們能容納的范圍大小不同。既然原理一致,我們就不再逐一贅述。接下來,讓我們把目光轉向另一種重要的數(shù)據(jù)類型——小數(shù)類型

2.2.小數(shù)類型

1.float類型

語法:

float[(m, d)] [unsigned] : M指定顯示長度,d指定小數(shù)位數(shù),占用空間4個字節(jié) 

        與整型不同,float類型在定義時需要指定兩個參數(shù),語法為 float(M, D)。下面我來詳細解釋這兩個參數(shù)的含義和使用規(guī)則:

參數(shù)解析

  • M (總精度/顯示寬度):代表該浮點數(shù)總共可以顯示的最大數(shù)字位數(shù)(包括整數(shù)部分和小數(shù)部分的所有數(shù)字字符,不包括小數(shù)點本身和符號位)。
    • 例如:128.1 包含數(shù)字 1,2,8,1 → 總共 4 位數(shù)字
    • 12.81 包含數(shù)字 1,2,8,1 → 總共 4 位數(shù)字
  • D (小數(shù)位數(shù)/標度):代表該浮點數(shù)小數(shù)點后允許的最大位數(shù)。
    • 例如:128.1 的小數(shù)點后有 1 位數(shù)字 (1)
    • 12.81 的小數(shù)點后有 2 位數(shù)字 (81)

關鍵特性

  • MD 定義的是上限值[敲重點]:實際存儲的數(shù)字位數(shù)可以少于 M,小數(shù)位數(shù)可以少于 D,但不能超過
  • float 存儲的是近似值而非精確值(這一點與整型完全不同)
  • 數(shù)值范圍極大(約 ±10^38),但精度有限(約7位有效數(shù)字)

實例演示

        下面我通過一個建表實例,展示 float 類型的使用規(guī)則:

1. 創(chuàng)建測試表

-- 創(chuàng)建包含float(4,2)類型的測試表
CREATE TABLE product (
    name VARCHAR(20),  -- 產(chǎn)品名稱
    price FLOAT(4,2)   -- 價格(總位數(shù)不超過4,小數(shù)位不超過2)
);

2. 插入合法數(shù)據(jù)

-- 有效數(shù)據(jù):總位數(shù)4,小數(shù)位2
INSERT INTO product VALUES ('鉛筆', 12.34);  -- 數(shù)字:1,2,3,4 → 4位
?
-- 有效數(shù)據(jù):總位數(shù)3<4,小數(shù)位1<2
INSERT INTO product VALUES ('橡皮', 8.5);    -- 數(shù)字:8,5 → 2位(總位數(shù)不足)
?
-- 有效數(shù)據(jù):邊界值測試
INSERT INTO product VALUES ('筆記本', 99.99); -- 數(shù)字:9,9,9,9 → 4位

3. 插入非法數(shù)據(jù)(驗證限制)

-- 超出總位數(shù)限制(5>4)
INSERT INTO product VALUES ('鋼筆', 100.00); 
-- 錯誤:總位數(shù)5 (1,0,0,0,0) > 4
?
-- 超出小數(shù)位限制(3>2)
INSERT INTO product VALUES ('尺子', 12.345); 
-- 錯誤:小數(shù)位數(shù)3 > 2
?
-- 同時違反兩項規(guī)則
INSERT INTO product VALUES ('文具盒', 123.45); 
-- 錯誤:總位數(shù)5>4 且 小數(shù)位2>2?(實際D=2允許2位小數(shù),但總位數(shù)超限)

4. 查詢驗證

SELECT * FROM product;

        執(zhí)行結果應顯示:

+-----------+-------+
| name      | price |
+-----------+-------+
| 鉛筆      | 12.34 |
| 橡皮      |  8.50 | -- 自動補零顯示
| 筆記本    | 99.99 |
+-----------+-------+

重要注意事項

  • 精度陷阱float 存儲的是近似值,對精度要求高的場景(如金融計算)應使用 decimal 類型
-- 精度問題示例
INSERT INTO product VALUES ('計算器', 1.0 / 3.0); -- 存儲為0.3333333432674408
  • 參數(shù)可選性:可以不指定 (M,D),此時使用系統(tǒng)默認精度
CREATE TABLE temp (value FLOAT); -- 不指定參數(shù)
  • 顯示補充:當實際小數(shù)位不足時,查詢結果會自動補零顯示(如 8.5 顯示為 8.50

        通過以上實例,各位讀者可以清晰看到:float(4,2) 可以存儲 12.34(剛好滿位)、8.5(位數(shù)不足)和 99.99(邊界值),但拒絕 100.00(總位數(shù)超限)和 12.345(小數(shù)位超限)。這種靈活的位數(shù)控制使 float 成為處理科學計算和大范圍數(shù)值的理想選擇,但切記它的近似特性可能帶來精度問題!

2.decimal

        在金融計算、貨幣交易等需要絕對精度的場景中,decimal 類型是 MySQL 中最值得信賴的數(shù)據(jù)類型。與 float 的近似存儲不同,decimal固定精度存儲數(shù)值,確保計算結果完全精確,避免浮點數(shù)常見的舍入誤差問題。

核心特性解析

  • 精確存儲機制
    • 將數(shù)值拆分為整數(shù)部分小數(shù)部分分別存儲
    • 采用定點數(shù)表示法,而非浮點數(shù)的科學計數(shù)法
    • 完全避免二進制浮點數(shù)的精度損失問題
  • 參數(shù)定義語法
decimal(M, D)
  • M (總精度):總位數(shù)(整數(shù)部分+小數(shù)部分),范圍 1-65
  • D (小數(shù)位數(shù)):小數(shù)點后的位數(shù),范圍 0-30 且 D ≤ M
  • 示例:decimal(5,2) 可存儲 123.45(5位總數(shù),2位小數(shù))
  • 存儲空間優(yōu)化
  • 每9位數(shù)字占用4字節(jié)
  • 存儲空間 = 整數(shù)部分空間 + 小數(shù)部分空間
  • 示例:decimal(18,9) 需要 9字節(jié)(每部分9位,各需4字節(jié),共8字節(jié)?實際需要9字節(jié))

金融級精度演示

創(chuàng)建賬戶表

CREATE TABLE bank_account (
    account_id INT PRIMARY KEY,
    owner_name VARCHAR(50),
    -- 總位數(shù)10位,其中2位小數(shù)(最大存儲:99,999,999.99)
    balance DECIMAL(10,2)  
);

精確交易操作

-- 初始存款:精確存儲
INSERT INTO bank_account VALUES (1001, '張三', 10000.00);
?
-- 存款利息計算(年化3.5%,按日計息)
UPDATE bank_account 
SET balance = balance * (1 + 0.035/365)
WHERE account_id = 1001;
?
-- 查詢結果(顯示精確計算結果)
SELECT * FROM bank_account;

        輸出結果:

+------------+------------+--------------+
| account_id | owner_name | balance      |
+------------+------------+--------------+
|       1001 | 張三       | 10000.958904 | -- 精確到小數(shù)點后6位
+------------+------------+--------------+

邊界值測試

-- 最大允許值(符合decimal(10,2))
INSERT INTO bank_account VALUES (1002, '李四', 99999999.99); -- 成功
?
-- 超出整數(shù)部分限制
INSERT INTO bank_account VALUES (1003, '王五', 100000000.00); 
-- 錯誤:總位數(shù)超過10位(整數(shù)部分8位+小數(shù)2位=10位,100000000是9位整數(shù))
?
-- 超出小數(shù)部分限制
UPDATE bank_account SET balance = 12345.678 WHERE account_id = 1001;
-- 錯誤:小數(shù)位3位 > 2位(自動四舍五入為12345.68)

decimal vs float 關鍵對比

特性decimalfloat
精度保證精確存儲(無誤差)近似存儲(有誤差)
適用場景財務計算、貨幣金額科學測量、大范圍值
計算速度較慢(精確計算開銷大)較快
存儲空間較大(每9位需4字節(jié))固定4字節(jié)
數(shù)值范圍受M限制(最大10^65)極大(約±10^38)
小數(shù)處理精確舍入二進制近似

重要注意事項

  • 四舍五入規(guī)則
-- 顯示指定精度時的自動舍入
INSERT INTO bank_account VALUES (1004, '趙六', 123.456); 
-- 實際存儲:123.46(小數(shù)部分自動四舍五入到2位)
  • 默認精度設置
-- 不指定參數(shù)時使用默認精度
CREATE TABLE tax_records (
    amount DECIMAL  -- 等效于decimal(10,0)
);
  • 零值處理
-- 小數(shù)位不足時自動補零
INSERT INTO bank_account VALUES (1005, '錢七', 500.5);
SELECT balance FROM bank_account WHERE account_id = 1005;
-- 顯示:500.50
  • 計算精度擴展
-- 計算過程中會保留最大精度
SELECT balance * 1.123456789 FROM bank_account;
-- 結果將包含更多小數(shù)位

最佳實踐建議

  • 財務系統(tǒng)必選:所有貨幣金額、稅率計算必須使用 decimal
  • 合理設置精度
    • 貨幣:decimal(19,4)(兼容國際標準)
    • 百分比:decimal(5,2)(存儲0.00~999.99%)
    • 科學測量:根據(jù)儀器精度確定
  • 警惕隱式轉換
-- 混合類型計算可能導致精度丟失
SELECT balance + 123.456 FROM bank_account; -- 結果會被截斷
  • 性能權衡:高并發(fā)系統(tǒng)需評估精確計算帶來的性能開銷

黃金法則:當需要精確計算時選擇 decimal,當可接受近似值時選擇 float。在金融、電商、賬務系統(tǒng)中,decimal 的精度保障遠重于其性能開銷。

        通過 decimal 類型,MySQL 為開發(fā)者提供了符合銀行級標準的數(shù)值存儲方案。它的精確性特性使其成為處理貨幣金額、財務計算和任何需要完美精度的商業(yè)場景的首選工具。

        以上就是我想要講述的MySQL中關于數(shù)值類型的定義,各位目前想要掌握它們,我的建議是在后續(xù)我進行DML的時候,跟著我一起敲代碼。那么就可以更快的去掌握這些知識,畢竟比起死記硬背,動用往往是記憶最好的方式,下面我要進行字符串類型的講述了。

3.字符串類型

3.1.char類型

1.語法

        char類型相比數(shù)值類型,用法就比較簡單了,下面先來看看它的語法。

char(L): 固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值可以為255

        這個語法接受起來就比上面的float要簡單很多,我們僅需知道,此時char括號里面的數(shù)字代表的事可以存儲的字符的長度,記住,說的是字符的長度,而不是字節(jié)的長度,就比如,'你好'就代表兩個字符,'A'代表一個字符等等,下面我就通過一個例子來告訴各位它的用法。

2.用法

        下面,我繼續(xù)從student表里面添加一列,充當家庭住址(place),其用法如下(此時設計表的增的操作,我上篇文章已經(jīng)介紹了,忘記的讀者自行去看我上篇文章)。

alter table student add place char(20);

        此時,即可看到表里新增的一列。

        下面我往里面插入20個字符(測試閾值),可以看到插入是成功的。

        但是當我插入21個字符的時候,系統(tǒng)就會報錯了,這就可以看出MySQL對于數(shù)據(jù)范圍控制的嚴謹性。

3.2.varchar類型

1.語法

varchar(L): 可變長度字符串,L表示字符長度,最大長度65535個字節(jié)

   varchar 也是一種字符串類型。你可能會問,既然已有 char 類型,為何還需要 varchar?關鍵在于它們的存儲機制不同。

        如前所述,char固定長度的字符串。例如,當你定義一個長度為 20 個字符的 char 字段時,即使你只插入了一個字符的數(shù)據(jù),數(shù)據(jù)庫依然會分配完整的 20 個字符空間

        而 varchar 則是可變長度的字符串。在同樣的場景下(定義長度為 20,但僅插入 1 個字符),varchar 類型只會分配實際所需的空間,即僅占用 1 個字符的空間。

2.用法

        因為它和char類型的字符串其實很像(只不過是一個靜態(tài)一個動態(tài)),所以此時我就不寫用法了(偷懶一下)。

3.3.char類型和varchar類型的比較

1.比較

        此時,我們可以通過一張表格來看出這兩個類型的區(qū)別。

        從這張圖可以看出這倆的區(qū)別,我剛才也說了,varchar是變長的字符串,所以它的大小是根據(jù)當時字符大小來決定的,而char類型是定長字符串,無論輸入了多少個字符,只要在和合理的范圍內(nèi),它們的大小是確定的。

2.如何選擇這兩種類型

  • 如果數(shù)據(jù)確定長度都一樣,就使用定長(char),比如:身份證,手機號,md5 【但是我一般也是用varchar】。
  • 如果數(shù)據(jù)長度有變化,就使用變長(varchar), 比如:名字,地址,但是你要保證最長的能存的進去 。
  • 定長的磁盤空間比較浪費,但是效率高。
  • 變長的磁盤空間比較節(jié)省,但是效率低。
  • 定長的意義是,直接開辟好對應的空間
  • 變長的意義是,在不超過自定義范圍的情況下,用多少,開辟多少。

4.日期和時間類型

1.相關函數(shù)

        常用的日期有如下三個:

  • date:日期。‘yyyy-mm-dd’,占用三個字節(jié)。
  • datetime:時間日期格式,‘yyyy-mm-dd HH:ii:ss’表示范圍從1000到9999,占用八個字節(jié)。
  • timestamp:時間戳(比較常見的概念,之前我在C語言也使用過它),從1970年開始的yyyy-mm-dd HH:ii:ss格式和datetime完全一致,占用四個字節(jié)。

2.使用方法

1.date函數(shù)

        我們先來簡單的使用一下date函數(shù),此時我們往student表里新插入一列,bir代表學生的出生日期。

alter table student add bir date;

        往里面插入一個元素,這里我就拿我自己的出生日期作為要插入的元素,因為這里面設計到了DML的知識,所以各位先不用記住它的用法。

insert into student(bir) values('2005-2-17');

        檢查一下此時是否插入成功。

2.datetime

        下面我們繼續(xù)插入新的一列,此時就用enr來表示,代表著入學的年份。

alter table student add enr datetime;

        往里面插入隨機一個元素,記住用年月日時分秒來表示。

insert into student(enr) values('2023-9-3-12:32:12');

        此時就代表插入成功,看一下student里面存放的元素。

3.timestamp

        由于其用法和datetime類似,這里我就不多介紹了(后續(xù)我可能重新補充一下)。

5.小結

        此時文章到這里就結束了,這篇文章寫的比較趕,但也不能說是很趕,因為我前后大約四天才寫完的,所以文章可能讀起來不是那么流暢,這里我先說一聲抱歉了,出現(xiàn)這樣的原因是因為我這周是期末周,大多時間都是在‘預習’知識,信號和系統(tǒng)真的很痛苦,我是真的不太喜歡這門課,導致我學起來特別的難受,到現(xiàn)在我的腦子還是比較混亂的。本文其實還有集合類型沒有講述,但是由于我很少使用它,所以我就先不寫了,后期我可能會補充一點。在最后的hike,祝各位同時處在期末周的大學生們?nèi)〉靡粋€好成績,祝各位已經(jīng)放假的大學生們暑假快樂,祝所有人身體健康,每天都快快樂樂的,我是忘梓,一個默默無聞的小博主,各位大佬們,我們下篇文章見啦!

到此這篇關于 MySQL全面解讀數(shù)據(jù)類型及其影響分析的文章就介紹到這了,更多相關mysql數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mysql誤刪數(shù)據(jù)后快速恢復的辦法推薦

    mysql誤刪數(shù)據(jù)后快速恢復的辦法推薦

    手抖不小心把表里的數(shù)據(jù)刪除或修改錯誤怎么辦?該如何快速恢復呢?遇到這樣的問題怎么辦?下面這篇文章主要給大家介紹了關于mysql誤刪數(shù)據(jù)后快速恢復的相關資料,需要的朋友可以參考下
    2023-02-02
  • MySQL主從復制的原生安裝配置方案(非Docker環(huán)境)

    MySQL主從復制的原生安裝配置方案(非Docker環(huán)境)

    本文介紹了MySQL主從復制的原生安裝配置方案(非Docker環(huán)境),包含主庫和從庫的完整配置步驟,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2026-05-05
  • Navicat for MySQL 15注冊激活詳細教程

    Navicat for MySQL 15注冊激活詳細教程

    這篇文章主要介紹了Navicat for MySQL 15注冊激活詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 一文帶你搞懂MySQL如何創(chuàng)建索引

    一文帶你搞懂MySQL如何創(chuàng)建索引

    這篇文章主要為大家詳細介紹了MySQL創(chuàng)建索引的相關知識,包括索引的創(chuàng)建、使用與優(yōu)化,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2026-04-04
  • MAC下修改mysql默認字符集為utf8的方法

    MAC下修改mysql默認字符集為utf8的方法

    本文主要介紹了如何修改MAC版mysql默認字符集為utf8,如果你的MAC版mysql字符亂碼,可以參考一下這篇文章
    2018-03-03
  • Truncate Table的用法講解

    Truncate Table的用法講解

    今天小編就為大家分享一篇關于Truncate Table的用法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • MySQL為id選擇合適的數(shù)據(jù)類型

    MySQL為id選擇合適的數(shù)據(jù)類型

    為 id 列選擇一個好的數(shù)據(jù)類型非常重要,id 列會經(jīng)常用于做比較(例如聯(lián)合查詢的條件),以及用于查找其他列。而且,id 也經(jīng)常用于外鍵。因此,id 列的數(shù)據(jù)類型不僅僅關系自身數(shù)據(jù)表,也關系到與之關聯(lián)的其他數(shù)據(jù)表。因此,id 用何種數(shù)據(jù)類型就顯得十分重要
    2021-06-06
  • Ubuntu中MySQL的參數(shù)文件my.cnf示例詳析

    Ubuntu中MySQL的參數(shù)文件my.cnf示例詳析

    這篇文章主要給大家介紹了關于Ubuntu中MySQL的參數(shù)文件my.cnf的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-10-10
  • MYSQL主從庫不同步故障一例解決方法

    MYSQL主從庫不同步故障一例解決方法

    第一次做完主從庫同步后正常,但工作過程中發(fā)現(xiàn)有一個庫的數(shù)據(jù)庫沒有同步起來,在另外一個mysql(3307)中
    2010-06-06
  • MySQL在多表上創(chuàng)建視圖方法

    MySQL在多表上創(chuàng)建視圖方法

    本篇文章給大家分享了MySQL在多表上創(chuàng)建視圖方法以及相關技巧,有需要的朋友參考學習下。
    2018-06-06

最新評論

桃园县| 叙永县| 阿尔山市| 马山县| 科技| 射阳县| 湄潭县| 太谷县| 含山县| 马山县| 海丰县| 莱州市| 花垣县| 平原县| 巴青县| 墨竹工卡县| 尼玛县| 汕尾市| 盱眙县| 朝阳区| 贺兰县| 凌海市| 通渭县| 灵川县| 武宁县| 武义县| 思茅市| 新泰市| 海林市| 彰化县| 偃师市| 阜新市| 高州市| 社会| 莲花县| 酉阳| 武功县| 莒南县| 乌审旗| 潜江市| 庆安县|