Mysql數(shù)據(jù)類型面試題15連問
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
整數(shù)類型的 UNSIGNED 屬性有什么用?MySQL 中的整數(shù)類型可以使用可選的 UNSIGNED 屬性來(lái)表示不允許負(fù)值的無(wú)符號(hào)整數(shù)。使用 UNSIGNED 屬性可以將正整數(shù)的上限提高一倍,因?yàn)樗恍枰鎯?chǔ)負(fù)數(shù)值。 例如, TINYINT UNSIGNED 類型的取值范圍是 0 ~ 255,而普通的 TINYINT 類型的值范圍是 -128 ~ 127。INT UNSIGNED 類型的取值范圍是 0 ~ 4,294,967,295,而普通的 INT 類型的值范圍是 -2,147,483,648 ~ 2,147,483,647。 對(duì)于從 0 開始遞增的 ID 列,使用 UNSIGNED 屬性可以非常適合,因?yàn)椴辉试S負(fù)值并且可以擁有更大的上限范圍,提供了更多的 ID 值可用。 char和varchar的區(qū)別CHAR
VARCHAR:
VARCHAR(100)和 VARCHAR(10)的區(qū)別是什么?VARCHAR(100)和 VARCHAR(10)都是變長(zhǎng)類型,表示能存儲(chǔ)最多 100 個(gè)字符和 10 個(gè)字符。因此,VARCHAR (100) 可以滿足更大范圍的字符存儲(chǔ)需求,有更好的業(yè)務(wù)拓展性。而 VARCHAR(10)存儲(chǔ)超過(guò) 10 個(gè)字符時(shí),就需要修改表結(jié)構(gòu)才可以。 雖說(shuō) VARCHAR(100)和 VARCHAR(10)能存儲(chǔ)的字符范圍不同,但二者存儲(chǔ)相同的字符串,所占用磁盤的存儲(chǔ)空間其實(shí)是一樣的,這也是很多人容易誤解的一點(diǎn)。 不過(guò),VARCHAR(100) 會(huì)消耗更多的內(nèi)存。這是因?yàn)?VARCHAR 類型在內(nèi)存中操作時(shí),通常會(huì)分配固定大小的內(nèi)存塊來(lái)保存值,即使用字符類型中定義的長(zhǎng)度。例如在進(jìn)行排序的時(shí)候,VARCHAR(100)是按照 100 這個(gè)長(zhǎng)度來(lái)進(jìn)行的,也就會(huì)消耗更多內(nèi)存。 DECIMAL 和 FLOAT/DOUBLE 的區(qū)別是什么?DECIMAL 和 FLOAT 的區(qū)別是:DECIMAL 是定點(diǎn)數(shù),F(xiàn)LOAT/DOUBLE 是浮點(diǎn)數(shù)。DECIMAL 可以存儲(chǔ)精確的小數(shù)值,F(xiàn)LOAT/DOUBLE 只能存儲(chǔ)近似的小數(shù)值。 DECIMAL 用于存儲(chǔ)具有精度要求的小數(shù),例如與貨幣相關(guān)的數(shù)據(jù),可以避免浮點(diǎn)數(shù)帶來(lái)的精度損失。 在 Java 中,MySQL 的 DECIMAL 類型對(duì)應(yīng)的是 Java 類 int(10)和char(10)的區(qū)別?int(10)中的10表示的是顯示數(shù)據(jù)的長(zhǎng)度,而char(10)表示的是存儲(chǔ)數(shù)據(jù)的長(zhǎng)度。 為什么不推薦使用 TEXT 和 BLOB?數(shù)據(jù)庫(kù)規(guī)范通常不推薦使用 BLOB 和 TEXT 類型,這兩種類型具有一些缺點(diǎn)和限制,例如:
DATETIME 和 TIMESTAMP 的區(qū)別是什么?DATETIME 類型沒有時(shí)區(qū)信息,TIMESTAMP 和時(shí)區(qū)有關(guān)。 TIMESTAMP 只需要使用 4 個(gè)字節(jié)的存儲(chǔ)空間,但是 DATETIME 需要耗費(fèi) 8 個(gè)字節(jié)的存儲(chǔ)空間。但是,這樣同樣造成了一個(gè)問題,Timestamp 表示的時(shí)間范圍更小。
Boolean 類型如何表示?MySQL 中沒有專門的布爾類型,而是用 TINYINT(1) 類型來(lái)表示布爾值。TINYINT(1) 類型可以存儲(chǔ) 0 或 1,分別對(duì)應(yīng) false 或 true。 為什么不建議使用null作為默認(rèn)值Mysql不建議用Null作為列默認(rèn)值不是因?yàn)椴荒苁褂盟饕?,而是因?yàn)椋?/p>
不建議使用null作為默認(rèn)值,并且建議必須設(shè)置默認(rèn)值,原因如下:
為什么禁止使用外鍵
在阿里巴巴開發(fā)手冊(cè)中也有提到,傳送門 使用自增主鍵有什么好處?自增主鍵可以讓主鍵索引盡量地保持遞增順序插入,避免了頁(yè)分裂,因此索引更緊湊,在查詢的時(shí)候,效率也就更高。 自增主鍵保存在什么地方?不同的引擎對(duì)于自增值的保存策略不同:
自增主鍵一定是連續(xù)的嗎?不一定,有幾種情況會(huì)導(dǎo)致自增主鍵不連續(xù)。 1、唯一鍵沖突導(dǎo)致自增主鍵不連續(xù)。當(dāng)我們向一個(gè)自增主鍵的InnoDB表中插入數(shù)據(jù)的時(shí)候,如果違反表中定義的唯一索引的唯一約束,會(huì)導(dǎo)致插入數(shù)據(jù)失敗。此時(shí)表的自增主鍵的鍵值是會(huì)向后加1滾動(dòng)的。下次再次插入數(shù)據(jù)的時(shí)候,就不能再使用上次因插入數(shù)據(jù)失敗而滾動(dòng)生成的鍵值了,必須使用新滾動(dòng)生成的鍵值。 2、事務(wù)回滾導(dǎo)致自增主鍵不連續(xù)。當(dāng)我們向一個(gè)自增主鍵的InnoDB表中插入數(shù)據(jù)的時(shí)候,如果顯式開啟了事務(wù),然后因?yàn)槟撤N原因最后回滾了事務(wù),此時(shí)表的自增值也會(huì)發(fā)生滾動(dòng),而接下里新插入的數(shù)據(jù),也將不能使用滾動(dòng)過(guò)的自增值,而是需要重新申請(qǐng)一個(gè)新的自增值。 3、批量插入導(dǎo)致自增值不連續(xù)。MySQL有一個(gè)批量申請(qǐng)自增id的策略:
如果下一個(gè)事務(wù)再次插入數(shù)據(jù)的時(shí)候,則會(huì)基于上一個(gè)事務(wù)申請(qǐng)后的自增值基礎(chǔ)上再申請(qǐng)。此時(shí)就出現(xiàn)自增值不連續(xù)的情況出現(xiàn)。 4、自增步長(zhǎng)不是1,也會(huì)導(dǎo)致自增主鍵不連續(xù)。 InnoDB的自增值為什么不能回收利用?主要為了提升插入數(shù)據(jù)的效率和并行度。 假設(shè)有兩個(gè)并行執(zhí)行的事務(wù),在申請(qǐng)自增值的時(shí)候,為了避免兩個(gè)事務(wù)申請(qǐng)到相同的自增 id,肯定要加鎖,然后順序申請(qǐng)。 假設(shè)事務(wù) A 申請(qǐng)到了 id=2, 事務(wù) B 申請(qǐng)到 id=3,那么這時(shí)候表 t 的自增值是 4,之后繼續(xù)執(zhí)行。 事務(wù) B 正確提交了,但事務(wù) A 出現(xiàn)了唯一鍵沖突。 如果允許事務(wù) A 把自增 id 回退,也就是把表 t 的當(dāng)前自增值改回 2,那么就會(huì)出現(xiàn)這樣的情況:表里面已經(jīng)有 id=3 的行,而當(dāng)前的自增 id 值是 2。 接下來(lái),繼續(xù)執(zhí)行的其他事務(wù)就會(huì)申請(qǐng)到 id=2,然后再申請(qǐng)到 id=3。這時(shí),就會(huì)出現(xiàn)插入語(yǔ)句報(bào)錯(cuò)“主鍵沖突”。 而為了解決這個(gè)主鍵沖突,有兩種方法:
可見,這兩個(gè)方法都會(huì)導(dǎo)致性能問題。 因此,InnoDB 放棄了“允許自增 id 回退”這個(gè)設(shè)計(jì),語(yǔ)句執(zhí)行失敗也不回退自增 id。 utf8 、utf8mb3和 utf8mb4的區(qū)別utf8mb3:只支持最長(zhǎng)三個(gè)字節(jié)的BMP(Basic Multilingual Plane,基本多文種平面)字符(不支持補(bǔ)充字符)。 utf8mb4:mb4即 most bytes 4,即最多使用4個(gè)字節(jié)來(lái)表示完整的UTF-8,具有以下特征:
utf8mb4是utf8的超集并完全兼容它,是MySQL 在 5.5.3 版本之后增加的一個(gè)新的字符集,能夠用四個(gè)字節(jié)存儲(chǔ)更多的字符,幾乎包含了世界上所有能看到見的語(yǔ)言字符。
轉(zhuǎn)自https://www.cnblogs.com/seven97-top/p/18537862 該文章在 2024/11/11 9:36:11 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |