關於字段的選擇其實很多地方都有進行詳細的介紹,我這里只寫一下我在使用過程中的心得感受。如果想要全面的了解的話,大家可以去看高性能MYSQL這一本書籍,里面有一章節介紹的特別全面,基本涉及MYSQL中全部的字段的介紹。
我這里給大家介紹的就一些常用的字段,例如:int、float、double、 decimal、varchar、char、 date、datetime等八種常用的類型。
在數據庫設計過程中我們要本着夠用的原則,如果一味的把數據字段范圍設為最大或者默認值的話,會導致存儲空間大量的浪費。在數據量特別大的情況下,這樣的設計原理將會使數據庫空間造成嚴重的浪費,也會對數據庫的執行效率造成很大的影響。所以我們在做數據庫設計的時候要謹慎再謹慎、小心再小心。
下面說一下字段各自的使用原則:
1.當數據存儲的是字符,且長度是一個固定區間定值的話就可以考慮使用char來進行存儲,如果字符長度是未知的且長度變化特別明顯的話,這個時候最好使用varchar來存儲。但是不管使用的是哪種字段來進行存儲,都不要把字段的初始長度設置為最大化,應該是根據業務需求來存儲最合適的長度字段。
2.數據庫設計過程中盡量使用int來作為字段類型,因為在所有的數據類型中int不管是存儲空間還是執行速度方面都是最好的。例如:如果業務中存儲的都是數據的話而且長度不是特別長的話,就可以考慮使用int來進行存儲,或者業務中要對數據進行排序的時候需要使用某一標識權重之類的,也可以使用int來進行存儲。但是不要因為int高效,而有意識的把所有字段都設計成int來處理,最終還是要根據業務的具體需求來設計相應的字段。
3.在涉及到金額的時候如果對精度要求不高的情況下可以優先使用float,其次是使用double來進存儲。如果對精度要求比較高的情況下最好使用decimal來存儲,但是相應的它 的效率沒有float和double那么高效。具體使用哪種還是要根據業務的具體需求來選擇。
4.關於date和datetime的用法,就要看你想要存儲時間的精確值了,如果僅僅是想要精確到天的話使用date就可以了,如要要精確到秒一級別的就要使用datetime了。有時候大家使用datetime的使用卻只是存儲到天的日期單位時,這個時候就會自動添加00:00:00在數據的后面,作為秒一級別的數據。
5.int(5)和int(10)的區別是什么?想必大家也很好奇吧,其實5和10其實只是顯示長度的卻別而已,也就是不管int(x)x的值是什么值,存儲數字的取值范圍還是int本身數據類型的取值范圍,x只是數據顯示的長度而已。
6.varchar(10)和char(10)的差別是什么?存儲超過時候會發生什么問題呢?這個問題其實也相對經典,我也是整了很久才搞清楚的。在MYSQL5,5以后,varchar(x)x中范其實是存儲字段的長度范圍,就是一個字符代表一個長度,不管這個字符是漢子還是字符都算是一個長度單位。varchar雖然設置長度值,可是因為varchar是可變的長度類型,也就是當存儲的長度小於x時候,其實實際的存儲空間不是x而是實際存儲的字符長度+一些標示空間。當然如果超過x的長度的話還是會報錯的。而char(y)中y的值就是存儲空間實際的存儲長度,超過這個長度的話就會報錯。
---------------------
數據庫中字段的數據類型與JAVA中數據類型的對應關系
類型名稱 | 顯示長度 | 數據庫類型 | JAVA類型 | JDBC類型索引(int) | 描述 |
VARCHAR | L+N | VARCHAR | java.lang.String | 12 | |
CHAR | N | CHAR | java.lang.String | 1 | |
BLOB | L+N | BLOB | java.lang.byte[] | -4 | |
TEXT | 65535 | VARCHAR | java.lang.String | -1 | |
INTEGER | 4 | INTEGER UNSIGNED | java.lang.Long | 4 | |
TINYINT | 3 | TINYINT UNSIGNED | java.lang.Integer | -6 | |
SMALLINT | 5 | SMALLINT UNSIGNED | java.lang.Integer | 5 | |
MEDIUMINT | 8 | MEDIUMINT UNSIGNED | java.lang.Integer | 4 | |
BIT | 1 | BIT | java.lang.Boolean | -7 | |
BIGINT | 20 | BIGINT UNSIGNED | java.math.BigInteger | -5 | |
FLOAT | 4+8 | FLOAT | java.lang.Float | 7 | |
DOUBLE | 22 | DOUBLE | java.lang.Double | 8 | |
DECIMAL | 11 | DECIMAL | java.math.BigDecimal | 3 | |
BOOLEAN | 1 | 同TINYINT | |||
ID | 11 | PK (INTEGER UNSIGNED) | java.lang.Long | 4 | |
DATE | 10 | DATE | java.sql.Date | 91 | |
TIME | 8 | TIME | java.sql.Time | 92 | |
DATETIME | 19 | DATETIME | java.sql.Timestamp | 93 | |
TIMESTAMP | 19 | TIMESTAMP | java.sql.Timestamp | 93 | |
YEAR | 4 | YEAR | java.sql.Date | 91 |