資料庫優化第一步:資料型別links.jianshu.com
為什麼選擇合適的資料型別很重要?因為資料型別會影響儲存空間的開銷,也會影響資料的查詢效率,可以說這是你優化資料庫的第一步要做的事情。
代表的是字元,無論英文或中文 都可以儲存10個字元。
數字5並不是代表儲存的長度,int型的長度是4位元組固定的,括號裡的數字僅僅代表最小顯示的寬度。
int有符號數最小值:
-2 1 4 7 4 8 3 6 4 8
總共11位
2 1 4 7 4 8 3 6 4 7
總共10位
所以你懂得…… 其它的整數型別以此類推。
因為我們使用的是 innodb儲存引擎,內部的行儲存格式沒有區分固定長度和可變長度列(所有資料行都使用指向資料列值的頭指標),因此在本質上,使用固定長度的char列不一定比使用可變長度varchar列簡單。
可以用上表來表示,當定義char時,不管你存入多少字元,都會占用到你定義的字元數,而用varchar時,則和你輸入的字元數有關,會多一到兩個位元組來記錄位元組長度,當資料位占用的位元組數小於255時,用1個位元組來記錄長度,資料位占用位元組數大於255時,用2個位元組來記錄長度,還有一位來記錄是否為nul值
我平時會把這篇總結當做乙個字典,每次設計資料庫時忘記了會拿出來看下。
mysql支援的資料型別主要分為3類:
使用方式:即decimal(m,d)
m的取值範圍為1~65,取0時會被設為預設值,超出範圍會報錯。
d的取值範圍為0~30,而且必須<=m,超出範圍會報錯。
所以,很顯然,當m=65,d=0時,可以取得最大和最小值。
例如: decimal(5,2)
範圍: -999.99 到 999.99
如果儲存時,整數部分超出了範圍(如上面的例子中,新增數值為1000.01),就會報錯,不允許存這樣的值。
如果儲存時,小數點部分若超出範圍,就分以下情況:
若四捨五入後,整數部分沒有超出範圍,則只警告,但能成功操作並四捨五入刪除多餘的小數字後儲存。如999.994實際被儲存為999.99。
若四捨五入後,整數部分超出範圍,則報錯,並拒絕處理。如999.995和-999.995都會報錯。
浮點數是用來表示實數的一種方法,它用 m(尾數) * b( 基數)的e(指數)次方來表示實數,相對於定點數來說,在長度一定的情況下,具有表示資料範圍大的特點,但同時也存在誤差問題。如果希望保證值比較準確,推薦使用定點數資料型別。
例如: float(7,4)
範圍: -999.9999 到 999.9999
mysql儲存值時進行四捨五入,因此如果在float(7,4)列內插入999.00009,近似結果是999.0001。
float和double中的m和d的取值預設都為0,即除了最大最小值,不限制位數。
m、d範圍:
float和double中,若m的定義分別超出7和17,則多出的有效數字部分,取值是不定的,通常數值上會發生錯誤。因為浮點數是不準確的,所以我們要避免使用「=」來判斷兩個數是否相等。
字串型別指char、varchar、binary、varbinary、blob、text、enum和set。
往期文章一覽
把「策略模式」應用到實際專案中links.jianshu.com
造個輪子,我學到了什麼links.jianshu.com
技術面試中的軟技能links.jianshu.com
不同時重寫equals和hashcode又怎樣!links.jianshu.com
中文存入資料庫亂碼問題
今天存中文路徑名到mysql資料庫中,突然出現亂碼,即中文名全是 搜尋之後,簡單改了一下 就解決了,方法如下 在更新語句 sql update experiment set path path where experiment id experimentid 中新增乙個 n 即可。結果為 sql2 ...
中文存入資料庫 MySQL 中文全文檢索(僅學習)
php 中文分詞 splitword scws 中文分詞 vicword乙個純php的分詞 在mysql 5.7.6之前,全文索引只支援英文全文索引,不支援中文全文索引,需要利用分詞器把中文段落預處理拆分成單詞,然後存入資料庫。從mysql 5.7.6開始,mysql內建了ngram全文解析器,用來...
mysql資料庫入門第一步之建立表
右鍵 新建資料庫 輸入庫名 選擇字符集和排序規則,點確定 建立資料庫成功 新建表my 表 右鍵 新建表 如上圖所示,在第乙個標籤頁 字段 中 名 欄位的名字 型別 欄位的型別,有幾十種,常用的有以下幾種 www.cppcns.com 長度 資料存的最大長度,對於不同的字段型別,長度表示的意義也不一樣...