數據庫支持的數據類型


數據庫支持的數據類型

整型

# 建表
mysql>: create table tb1(x tinyint, y smallint, z int(6));

# 插入數據
mysql>: insert into tb1 values(128, 32768, 32768); # 結果:127,32767,32768

# 結論:整型的長度由所占字節(取值范圍)決定,可以自定義長度,但是不影響所占字節(取值范圍)
# 	 所有整型變量的長度一般都省略不寫
結論>: create table tb1(x tinyint, y smallint, z int);


# 整型約束
mysql>: create table tb2(x tinyint unsigned); # 0~255
mysql>: insert into tb2 values(256), (-1);  # 255, 0
   
# 0填充約束
mysql>: create table tb3(x tinyint unsigned zerofill);
mysql>: insert into tb3 values(10); # 010

tinyint

  • 1字節
    • 取值范圍-128~127
    • 默認長度4

smallint

  • 2字節
    • 取值范圍-32768~32767
    • 默認長度6

mediumint

  • 3字節
    • 取值范圍-16777216~16777215
    • 默認長度9

int

  • 4 字節
    • 取值范圍-2147483649~2147483647
    • 默認長度11

bigint

  • 8字節

約束

  • unsigned 無符號
    • 默認長度-1
  • zerofill 0填充
    • 當數字長度不到默認長度時,用0在前面補全

PS:超出范圍會用極限值來存儲

浮點數

# 建表:
mysql>: create table tb4 (age float(256, 30)); # Display width out of range for column 'age' (max = 255)
mysql>: create table tb5 (age float(255, 31)); # Too big scale 31 specified for column 'age'. Maximum is 30.
mysql>: create table tb5 (age float(65, 30)); # 在合理取值范圍
   
mysql>: create table t12 (x float(255, 30));
mysql>: create table t13 (x double(255, 30));
mysql>: create table t14 (x decimal(65, 30));
# 1.111111164093017600000000000000 
mysql>: insert into t12 values(1.11111111111111111119);  
# 1.111111111111111200000000000000
mysql>: insert into t13 values(1.11111111111111111119);
# 1.111111111111111111190000000000
mysql>: insert into t14 values(1.11111111111111111119);

# 重點:長度與小數位分析
# 報錯,總長度M必須大於等於小數位D
mysql>: create table t14 (x decimal(2, 3));

# 能存儲 -0.999 ~ 0.999,超長度的小數位會才有四舍五入,0.9994可以存,就是0.999,0.9995不可以存
mysql>: create table t14 (x decimal(3, 3)); # 整數位 3 - 3,所以最大為0

# 能存儲 -9.999 ~ 9.999,超長度的小數位會才有四舍五入,9.9994可以存,就是9.999,9.9995不可以存
mysql>: create table t14 (x decimal(4, 3)); # 整數位 4 - 3,所以最大為9

# 能存儲 -99.999 ~ 99.999,超長度的小數位會才有四舍五入,99.9994可以存,就是99.999,99.9995不可以存
mysql>: create table t14 (x decimal(5, 3)); # 整數位 5 - 3,所以最大為99

float(M, D)

  • 4字節
    • 子主題 1
  • 精度最低,最常用(占用字節少)

double(M, D)

  • 8字節
  • 精度高,占位多

decimal(M, D) 定點型

  • 全精度,用字符串表示小數
  • 占用字節的長度在M,D的基礎上+2,表示符號和小數點

(M,D)

  • M 表示位數
  • D 表示小數位
  • M要大於等於D

PS:超出范圍會用極限值來存儲

字符串

# 建表:
mysql>: create table ts1 (s1 char(4), s2 varchar(4));
mysql>: insert into ts1 values('adcde', 'xyzabc'); # 'adcd', 'xyza'

char(n)

  • 定長
  • 永遠采用設置的長度存儲數據
  • 數據的長度永遠為n

varchar(n)

  • 不定長
  • 在設置的長度范圍內,變長的存儲數據
  • 數據的長度為具體字符串的長度,並將這個長度存儲在別處,查詢的時候使用

char與varchar比較

  • char
    • 存取取數據時,按固定長度操作,效率高
  • varchar
    • 存儲數據時,會現計算數據的長度,動態變長的存儲數據,所以一般比較省空間,但計算耗時,效率低
    • 注意的是因為計算的數據長度也要空間存儲,存儲在數據頭(數據開始前),也需要1~2個字節
  • 總結:
    • 數據長度變化不大,用char
    • 數據長度變化大,用varchar

PS:超范圍會舍棄范圍外的字符串

時間

# 建表:
mysql>: create table td1 (my_year year, my_date date, my_time time);
mysql>: insert into td1 values(1666, '8888-8-8', '8:8:8'); # 時間需要在取值訪問內

mysql>: create table td2 (my_datetime datetime, my_timestamp timestamp);  
mysql>: insert into td2 values('2040-1-1 1:1:1', '2040-1-1 1:1:1'); # 時間需要在取值訪問內  
mysql>: insert into td2(my_datetime) values('2040-1-1 1:1:1'); # timestamp不復制會才有系統當前時間

# datetime:8字節,可以為null
# timestamp:4字節,有默認值CURRENT_TIMESTAMP

year

  • yyyy(1901/2155)

date

  • yyyy-MM-dd(1000-01-01/9999-12-31)

time

  • HH:mm:ss

datetime

  • 8字節
  • 可以為null
  • yyyy-MM-dd HH:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59)

timestamp

  • 4字節
  • 有默認值,基於當前時間
  • yyyy-MM-dd HH:mm:ss(1970-01-01 00:00:00/2038-01-19 ??)
  • ?? 表示截止的具體時間未知

PS:時間存儲時要超出范圍,否則數據會不精確

枚舉與集合

# 建表
# enum、set默認值為NULL
mysql>: create table tc1 (name varchar(20), sex enum('男', '女', '哇塞'), hobbies set('男', '女', '哇塞'));
mysql>: insert into tc1 values('ruakei', '哇塞哇塞', '未知');  
   
# enum、set手動設置默認值 '男' 與 '哇塞'
mysql>: create table tc2 (name varchar(20), sex enum('男', '女', '哇塞') default '男', hobbies set('男', '女', '哇塞') default '哇塞');
mysql>: insert into tc2 values('ruakei', '哇塞哇塞', '未知');  
mysql>: insert into tc2(name) values('ruakei');
   
# 對sex、hobbies兩個字段賦值錯誤,系統默認用空字符串填充(非安全模式),安全模式拋異常
# 如果對出sex、hobbies兩個字段外的其他字段進行賦值,這兩個字段會才有默認值

# 注:對set類型的字段進行賦值,用一個字符串,字符串內部用,將多個選項隔開,且不能添加空格等其他額外字符
mysql>: insert into tc2 values('ruakei_1', '女', '男,女,哇塞');  

枚舉

  • 枚舉里的值都是字符串
  • 存儲的時候只能選一個

集合

  • 集合里的值都是字符串
  • 存儲的時候可以選擇任意個

PS:可以設置默認值,不設置時是null,不賦值的時候為默認值

當存儲的值不在你的設置范圍了,就用null存儲

PS:對set類型的字段進行賦值,用一個字符串,字符串內部用,將多個選項隔開,且不能添加空格等其他額外字符

約束

# not null 與 default 限制
# 不能為空,沒有默認值的x,必須賦值
# y、z在沒有賦值情況下,才有默認值,設置值后,采用默認值
mysql>: create table td1 (x int not null, y int default 0, z int default 100);

# 報錯,auto_increment必須設置給 鍵字段
mysql>: create table td2 (x int auto_increment);
# 報錯,auto_increment必須設置給 int字段
mysql>: create table td2 (x char(4) auto_increment);
# 報錯,auto_increment字段最多出現 1次
mysql>: create table td2 (x int unique auto_increment, y int unique auto_increment);

# 正確,主鍵和唯一鍵分析
# x為主鍵:沒有設置primary key時,第一個 唯一自增鍵,會自動提升為主鍵
mysql>: create table td21 (x int unique auto_increment, y int unique);
# y為主鍵:沒有設置primary key時,第一個 唯一自增鍵,會自動提升為主鍵
mysql>: create table td22 (x int unique, y int unique auto_increment);
# x為主鍵:設置了主鍵就是設置的,主鍵沒設置自增,那自增是可以設置在唯一鍵上的
mysql>: create table td23 (x int primary key, y int unique auto_increment);
# x為主鍵:設置了主鍵就是設置的,主鍵設置了自增,自增字段只能有一個,所以唯一鍵不能再設置自增了
mysql>: create table td24 (x int primary key auto_increment, y int unique);
# 默認主鍵:沒有設置主鍵,也沒有 唯一自增鍵,那系統會默認添加一個 隱式主鍵(不可見)
mysql>: create table td25 (x int unique, y int unique);

# 唯一鍵:確保一個字段,數據不能重復
# 主鍵:是一條記錄的唯一標識(可以理解為數據的編號)

# 聯合唯一
# ip在port不同時,可以相同,ip不同時port也可以相同,均合法
# ip和port都相同時,就是重復數據,不合法
mysql>: create table tu1 (ip char(16), port int, unique(ip, port));

# 也可以設置成 聯合主鍵,道理同 聯合唯一
mysql>: create table tu2 (ip char(16), port int, primary key(ip, port));
# sql可以多行書寫
mysql>: 
create table t22(
	ip char(16),
  port int,
  primary key(ip,port)
);

  • primary key
    • 主鍵
  • foreign key
    • 外鍵
  • unique
    • 唯一性數據
  • auto_increment
    • 自增
    • 只能加給有key的int類型
    • 作為輔助修飾
    • 一般來說,一個表只有一個自增字段
  • not null
    • 不為空
    • 對於某些數據,不能讓它存空值,一定要有數據
  • default
    • 默認值
    • 對於沒有存儲的字段,用默認值存儲
  • unsigned
    • 無符號
    • 針對數字,沒有負數,從0開始
  • zerofill
    • 0填充
    • 存整數時數據長度小於取值范圍長度,會在數字前用0填充
  • 聯合唯一
    • unique(字段1,字段2)
    • 表示兩條記錄不能字段1和字段2同時相同

XMind: ZEN - Trial Version


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM