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