1. 數(shù)據(jù)類型
學(xué)習(xí)語言的時候首先就是學(xué)習(xí)數(shù)據(jù)類型,數(shù)據(jù)類型起著為變量合理分配空間的作用。數(shù)據(jù)庫同樣需要合理使用空間,其次還可以約束SQL語句的正確性,所以同樣需要數(shù)據(jù)類型。
1.0. 數(shù)據(jù)類型分類
分類 | 數(shù)據(jù)類型 | 解釋 |
---|---|---|
數(shù)值類型 | BIT (M) | 位類型。M指定位數(shù),默認為1,范圍1-64 |
BOOL | 使用1或0表示真或假 | |
整型 | TINYINT [UNSIGNED] | 相當于C語言中的char類型 |
SMALLINT [UNDIGNED] | 相當于C語言中的short類型 | |
INT [UNSIGNED] | 相當于C語言中的int類型 | |
BIGINT [UNSIGNED] | 相當于C語言中的long long類型 | |
小數(shù)類型 | FLOAT [ (M, D) ] [UNSIGNED] | 小數(shù)類型,M指定長度,D指定小數(shù)位數(shù) |
DOUBLE [ (M, D) ] [UNSIGNED] | 對應(yīng)C的double類型,M長度,D小數(shù)位數(shù) | |
DECIMAL (M, D) [UNSIGNED] | M長度,D小數(shù)位數(shù) | |
文本、二進制類型 | CHAR (SIZE) | 定長字符串,最大長度255 |
VARCHAR (SIZE) | 變長字符串,最大長度65536 | |
BLOB | 二進制數(shù)據(jù) | |
TEXT | 大文本,不支持全文索引,不支持默認值 | |
時間日期 | DATE / DATETIME / TIMESTAMP | (yyyy-mm-dd) / (yyyy-mm-dd hh:mm:ss) |
String 類型 | ENUM | 字符串對象 |
SET | 字符串對象 |
1.1. 數(shù)值類型
C語言給變量賦值超過其本身承受的大小,會自行截斷。但SQL中當我們插入了類型大小范圍之外的越界數(shù)據(jù),SQL會直接拒絕。數(shù)據(jù)類型的本質(zhì)就是一種SQL對我們的約束。
tinyint類型
- 在MySQL中,整型可以指定有無符號兩種,默認是有符號的。可在類型之后指明
unsigned
以示無符號。
盡量不使用unsigned,對于有符號類型存不下不如提升至更大容量的類型。
bit類型
bit[(M)] # 位字段類型。M表示每個值的位數(shù),范圍1-64。如果不帶M默認為1。
MySQL5.7默認以ASCII字符顯示,MySQL8.0默認以十六進制顯示。
小數(shù)類型
float[(M, D)] [unsigned] # M指顯示長度,D指小數(shù)位數(shù),總大小4字節(jié)
- 比如 float(4,2) 表示的范圍是:-99.99~99.99,MySQL在保存時會進行四舍五入。
- float(4,2) usigned 表示的范圍是:0~99.99,并不會將正數(shù)范圍擴大2倍。
decimal(m, d) [unsigned] # M指顯示長度,D指小數(shù)位數(shù)
如果希望小數(shù)精度更高,推薦使用decimal。float表示最大精度為7位,decimal最大為30位。
如果D被省略默認為0,M默認為10。但最好不要省略,可能版本不一致會導(dǎo)致問題。
1.2. 字符串類型
char類型
char(L) # 定長字符串 L是可以存儲的字符長度,最大長度為255字符
字符和字節(jié)不一樣,一個字符一定占一個字節(jié),比如Unicode字符。
varchar類型
varchar(L) # 變長字符串,L表示字符長度,最大為65536字節(jié)
-
varchar最大長度是65536字節(jié)不是字符,char最大長度是255字符不是字節(jié)。
-
varchar和char的
(L)
值的單位一樣,都是字符長度。 -
char 不管存儲的數(shù)據(jù)如何,實際占用始終都是L個字符的大小,varchar 的實際占用和數(shù)據(jù)大小相關(guān)。定長和變長體現(xiàn)在實際存儲大小。
可以理解成char類型就是C語言中的字符數(shù)據(jù)
char*
,varchar就是C++中的string容器。
- 如果數(shù)據(jù)長度一樣就用定長char,如果變化就用變長varchar;
- 定長浪費空間但效率高,變長節(jié)省空間但效率低。
日期和時間類型
常用的日期時間類型有三個:
類型 | 含義 | 格式 | 解釋 |
---|---|---|---|
date | 日期 | yyyy-mm-dd |
占用三字節(jié) |
datetime | 日期時間 | yyyy-mm-dd HH:ii:ss |
表示范圍從1000到9999,占用八字節(jié) |
timestamp | 時間戳 | yyyy-mm-dd HH:ii:ss |
只能表示從1970年開始的時間,占用四字節(jié) |
-
date
和datetime
的區(qū)別就是格式上的區(qū)別 -
timestamp
自動更新當前操作的時間,不需要手動設(shè)置。
設(shè)置日期時的輸入格式比較寬松,最后都會轉(zhuǎn)成標準格式。
1.3. enum和set類型
# 枚舉,單選類型
enum ('選項1', '選項2', '選項3', ...);
- 插入是必須插入規(guī)定的選項值,不允許其他值。
- 使用
enum
枚舉類型,實際上在存儲的時候使用 的是從1開始的數(shù)字字符。
規(guī)范使用,不推薦使用數(shù)字做插入篩選等操作。
# 集合,多選類型
set ('選項1', '選項2', '選項3', ...);
- enum枚舉只能單選,但set集合類型可以多選。同樣,set類型只能插入規(guī)定好的值。
如圖所示,set類型由于能夠表示多個選項,數(shù)字和選項不能單純按順序?qū)?yīng)。
請?zhí)砑訄D片描述
set類型存儲時采用的是位圖結(jié)構(gòu)。從低到高每個比特位表示一個選項,比特位為1表示具有該選項,反之則沒有。
- 單純用
where xx='xx'
查詢會嚴格篩選出只具有該選項的記錄,若想要篩選出包含該選項的記錄可以使用find_in_set
。
?
數(shù)據(jù)類型本質(zhì)也就是一種約束,所謂約束可以理解為不滿足條件就不允許操作。約束給予了表中的數(shù)據(jù)極大的確定性。
2. 表的約束
沒有規(guī)矩不成方圓,MySQL為了讓數(shù)據(jù)庫表中的數(shù)據(jù)完整性一致性非常強,MySQL會給我們提供強約束。
2.1. 空屬性
兩個值:NULL和NOT NULL。MySQL中的NULL表示不存在、為空,和C語言中的NULL沒有任何關(guān)系。
數(shù)據(jù)庫字段默認一般都為空,但實際中需要盡量保證字段非空。設(shè)置了非空就不能不插入了。
設(shè)置not null
方式如下:
2.2. 默認值
設(shè)置default可以避免該字段為空,不填自動設(shè)置為默認值。
如果一個字段即設(shè)置 not null 又設(shè)置 default,那么 not null 就失去作用了。
2.3. 列描述
列描述:comment 字段,沒有實際意義,用來描述字段,相當于注釋的作用。
2.4. zerofill
當我們創(chuàng)建一個int
類型的字段時,MySQL會自動為我們添加一個(11)
。如果我們沒有設(shè)置zerofill屬性,這個值是無意義的。
如果插入的數(shù)據(jù)低于指定的位數(shù),就在前面補0,如果插入的數(shù)據(jù)超過了指定的位數(shù),就正常顯示,這就是zerofill的作用。只對顯示結(jié)果調(diào)整,不影響存儲結(jié)果。
2.5. 主鍵
數(shù)據(jù)庫存儲數(shù)據(jù)不是唯一的目的,還要考慮到提取數(shù)據(jù)。一般,要求數(shù)據(jù)庫表中的記錄有一個特定的唯一標識,來表示唯一性。
這個唯一的特定標識就是主鍵,類似于序號學(xué)號這樣的唯一標識,可以根據(jù)主鍵來唯一地篩選出一條記錄。
- 創(chuàng)建表并指定主鍵字段,主鍵字段不可重復(fù)。
- 為已存在字段刪除主鍵約束
alter table `tb_name` drop primary key; # 刪除主鍵
只是為字段去掉主鍵約束,并不是刪除整列。
- 為已存在字段追加主鍵
alter table `tb_name` add primary key(`field`); # 追加主鍵
如果字段有重復(fù)值,會追加失敗。
復(fù)合主鍵
create table `tb_name` (
`field` datatype,
primary key (`field`) # 設(shè)置復(fù)合主鍵
);
如果想讓多個字段合起來作為主鍵,就可以使用復(fù)合主鍵。也就是讓多個字段聯(lián)合在一起作為唯一標識,單個重復(fù)是無所謂的,只要不是多個字段一起沖突就行。
2.6. 自增長
被auto_increment
設(shè)置的字段,可以不給值,會自動被系統(tǒng)從當前最大值加1設(shè)置到記錄。一般自增長的字段都是作為主鍵。
- 自增長字段不用設(shè)置初始值,默認從1開始遞增。
- 自增長字段也可以插入數(shù)據(jù),只要不與已有數(shù)據(jù)重復(fù)即可。之后新增數(shù)據(jù)會從最大值開始遞增。
- 被自增長的字段必須作為主鍵或者其他具有唯一性的鍵使用。
2.7. 唯一鍵
一張表中往往存在多個字段需要唯一,但主鍵只有一個,只能用唯一鍵解決這個問題。
- 唯一鍵和主鍵性質(zhì)差不多,但唯一鍵允許為空,NULL表示沒有不參與任何運算。如果將唯一鍵設(shè)置為不能為空則自動轉(zhuǎn)換成主鍵。
- 主鍵是用來保證整個表的記錄的唯一性的,唯一鍵用來保證所設(shè)置的字段在業(yè)務(wù)上的唯一性。主鍵只能有一個,唯一鍵能設(shè)置多個。
可以說,主鍵和唯一鍵并不沖突,他們不是用來對比的,只是負責數(shù)據(jù)在不同層面的唯一性。
2.8. 外鍵
外鍵用來將主表和從表之間建立關(guān)系,讓從表和主表產(chǎn)生關(guān)聯(lián)的字段就叫做外鍵。外鍵定義在從表上,一般外鍵就對應(yīng)著主表的主鍵。
create table `tb_name` (
# ... ,
foregin key (`field`) reference `tb_master`(`field`)
)
通過外鍵產(chǎn)生關(guān)系的表,除了在邏輯上有關(guān)聯(lián),MySQL也會維護該邏輯對用戶操作產(chǎn)生約束。
比如班級表中得先有id為30的班級,才能在學(xué)生表中添加class_id為30的學(xué)生。
要刪除班級表中id為20的班級,首先必須保證學(xué)生表中沒有對應(yīng)班級的學(xué)生。
對于數(shù)據(jù)庫用戶來說,外鍵是為了方便業(yè)務(wù)關(guān)聯(lián),對于MySQL來說,外鍵是為了產(chǎn)生對應(yīng)的外鍵約束,保證數(shù)據(jù)的安全。文章來源:http://www.zghlxwxcb.cn/news/detail-450657.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-450657.html
到了這里,關(guān)于MySQL:數(shù)據(jù)類型和表的約束的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!