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