1. 程式人生 > 其它 >字元編碼、欄位型別與欄位約束條件

字元編碼、欄位型別與欄位約束條件

字元編碼

字元編碼相關

檢視字元編碼

在cmd視窗登入資料庫客戶端以後鍵入以下命令
  \s
  """
  如果是5.X系列 顯示的編碼有多種
  	latin1
  	gbk
  如果是8.X系列 顯示的統一是utf8mb4
  	utf8mb4是utf8優化版本 支援儲存表情
  """

字元編碼配置檔案

	5.X版本mysql資料庫預設編碼有多種 可能會導致亂碼的情況 所以應該統一編碼
  	my-default.ini配置檔案
  步驟1:拷貝一份該配置檔案並修改名稱為my.ini
  步驟2:清空my.ini檔案內的內容
  步驟3:新增固定的配置資訊即可
    [mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
  步驟4:儲存並重啟服務端即可生效
    net stop mysql
    net start mysql

儲存引擎

儲存引擎理論

儲存引擎可以理解為處理資料的不同方式

儲存引擎的檢視

show engines;

需要掌握的儲存引擎的種類

MyISAM

是5.1x版本以前的mysql資料庫預設的儲存引擎,具有存取資料速度快、功能少、安全性低的特點

InnoDB

5.1版本以後的mysql資料庫預設的儲存引擎,具有多功能 安全性較高 存取速度沒有MyISAM快的特點

BlackHole

具有寫入任何的資料都會消失的特點

Memory

具有以記憶體作為資料存取地 速度快但是斷電立刻丟失資料 的特點

自定義儲存引擎

句式create table 表名(欄位名 欄位型別)engine=儲存引擎名
例create table t1(id int)engine=myisam;

建立表的完整語法

create table 表名( 欄位名1 欄位型別(數字) 約束條件, 欄位名2 欄位型別(數字) 約束條件, 欄位名3 欄位型別(數字) 約束條件 );

  1. 欄位名和欄位型別是必須的
  2. 數字和約束條件是可選的
  3. 約束條件可以寫多個 空格隔開即可(後面詳細講解)
    欄位名1 欄位型別(數字) 約束條件1 約束條件2 約束條件3
  4. 最後一行欄位結尾不能加逗號

欄位型別

整型

  tinyint							1bytes				
  smallint						        2bytes
  int								4bytes
  bigint							8bytes
  上述整型的區別在於從上往下能夠儲存的數字範圍越來越大
  注意事項
    1.需要考慮正負數的問題 如果需要儲存負數 則需要佔據一個位元位
    2.注意手機號如果使用整型來儲存 需要使用bigint才可以
"""
工作小技巧:有時候看似需要使用數字型別儲存的資料其實可能使用的是字串
	因為字串可以解決不同語言對數字不精確的缺陷!!!
"""
  create table t5(id tinyint);
  insert into t5 values(-129),(256);
  # 如果是在5.6版本不會報錯 會自動處理成最大範圍(沒有意義)
    步驟1:set global sql_mode = 'STRICT_TRANS_TABLES';
    步驟2:退出客戶端 重新登入即可
  # 如果是在5.7及以上版本 則會直接報錯(更加合理)
    驗證(結論)發現所有的整型都預設帶有正負號 如何修改不帶正負號(約束條件)
    create table t6(id tinyint unsigned);

浮點型

  float
  double
  decimal
  上述浮點型從上往下精確度越來越高
    float(255,30)   總共255位 小數位佔30位
    double(255,30)  總共255位 小數位佔30位
    decimal(65,30)  總共65位 小數位佔30位
  重點研究精確度問題
    create table t7(id float(255,30));
    create table t8(id double(255,30));
    create table t9(id decimal(65,30));
    insert into t7 values(1.11111111111111111);
    insert into t8 values(1.11111111111111111);
    insert into t9 values(1.11111111111111111);
  decimal>double>float
"""
雖然三者精確度有差距 但是具體用哪個應該結合實際情況
	比如正常業務 使用float足夠
	如果是高精尖 可以使用decimal
"""

字元型

  char
  varchar
  上述兩個字元型別的區別在於一個是定長一個是變長
  eg:
    char(4)    
    	定長 最大隻能儲存四個字元 超出則報錯 不夠則空格填充至四個
    varchar(4)
    	變長 最大隻能儲存四個字元 超出則報錯 不夠則有幾個存幾個
  驗證定長與變長特性
  	create table t10(name char(4));
        create table t11(name varchar(4));
        insert into t10 values('jason');
        insert into t11 values('jason');
    # 如果是5.6版本並且沒有修改嚴格模式 則會自動擷取四個字元(不合理)
    # 臨時修改 
      步驟1:set global sql_mode = 'STRICT_TRANS_TABLES';
      步驟2:退出客戶端 重新登入即可
    # 永久修改
      修改my.ini配置檔案
      sql_mode = 'STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY'
      重啟服務端之後永久生效
    
"""
課外擴充套件研究
	char_length()  獲取欄位資料的長度
	該方法無法直接獲取到定長的真實長度 
	因為MySQL在存資料的時候會自動填充空格在取資料的時候又會自動移除空格
	
能不能讓MySQL在取資料的時候不自動移除空格
	單次修改
		set session sql_mode = 'pad_char_to_full_length'
"""

# 工作中使用char還是varchar
	char
  	整存整取 速度快
    會造成一定的儲存空間浪費
  '''
  jasonkevintony tom  jerry
  '''
  varchar
    節省儲存空間
    存取資料的速度沒有char快(取資料不知道資料的精確長度)
  '''
  varchar在存資料的時候會生成一個1bytes的報頭 記錄資料長度
  varchar在取資料的時候先會讀取1bytes的報頭 從中獲取真實資料長度
 	  1bytesjason1bytes+kevin1bytes+tony
  '''
  # 以前幾乎使用的都是char  現在varchar使用頻率也越來越高
  """
  兩者都有使用場景
  	比如:
  		針對統一中國人的姓名 應該採取那個型別  >>> varchar
  		規模較小 資料量相對固定的字典	>>> char
  很多時候欄位型別的選取和命名都會在郵件中標明(組長、架構師、產品)
  """

數字的含義

欄位型別括號內的數字大部分情況下是用來限制儲存的長度
但是在整型中並不是用來限制長度 而是用來控制展示長度

      create table t12(id int(3));
      insert into t12 values(1111);  # 不會報錯

      create table t13(id int(3) zerofill);  # 位數不夠用0填充
      insert into t13 values(1);  # 001
      insert into t13 values(1111);  # 有幾位就展示幾位
"""
結論
	以後涉及到整型欄位 都無需自己定義長度 直接使用自帶的即可
	而針對其他型別的欄位 則需要自己新增數字
"""

列舉與集合

列舉

多選一
    create table t14(
  	id int,
    name varchar(32),
    gender enum('male','female','others')
  );
  '''插入資料的時候 針對gender只能填寫提前定義好的數值'''

集合

多選多(也可以多選一)
  create table t15(
  	id int,
    name varchar(32),
    hobby set('籃球','足球','雙色球','排球','水球','肉球')
  );

列舉與集合都是該欄位資料只能從給出的預設的資料裡選。否則會報錯。列舉是多選一,集合是多選一或多

日期型別

date							年月日
datetime					        年月日時分秒
time							時分秒
year							年

create table t16(
  id int,
  name varchar(32),
  reg_time datetime,
  birth date,
  study_time time,
  join_time year
);
# 針對時間資料一般都是通過程式碼自動獲取並新增 我們這裡手動模擬
insert into t16 values(1,'jason','2000-11-11','2002-01-21','11:11:11','2015');

約束條件

約束條件是基於欄位型別之上的額外限制
eg: id int unsigned
欄位型別int規定了id欄位只能存整數
約束條件unsigned指的是整數基礎之上還必須是正數

unsigned (無需正負號)

zerofill(零填充)

對於位數不夠的整型資料用零進行填充

not null(非空)

  not null 
  create table t17(id int,name varchar(32));
'''插入資料的另外一種方式 打破欄位順序'''
  insert into t17(name,id) values('jason',1);
  insert into t17(id) values(2);
  
  create table t18(id int,name varchar(32) not null);
  insert into t18(id) values(2);  # 報錯
  insert into t18(id,name) values(2,null);  # 報錯
  insert into t18(id,name) values(2,'');  # 不報錯

default (預設值)

default
  create table t19(id int,name varchar(32) default 'jason');
  insert into t19(id) values(1);
  insert into t19(id,name) values(2,'kevin');

unique (唯一值)

	unique  
'''單列唯一:某個欄位下對應的資料不能重複 是唯一的'''
  create table t20(
    id int,
    name varchar(32) unique
  );
'''多列唯一:多個欄位下對應的資料組合到一起的結果不能重複 是唯一的'''
  create table t21(
  	id int,
    host varchar(32),
    port int,
    unique(host,port)
  );

primary key (主鍵)

  """
  1.單從約束層面上而言 相當於not null + unique(非空且唯一)
  	create table t22(id int primary key);
  2.是InnoDB儲存引擎規定的一張表有且必須要有一個主鍵 用於構建表
  	主鍵可以加快資料的查詢速度(類似於書的目錄)
  	如果建立表建立的時候沒有設定主鍵也沒有其他的鍵 那麼InnoDB會採用一個隱藏的欄位作為表的主鍵(隱藏就意味著而無法使用 即無法加快資料查詢)
  	如果沒有主鍵但是有非空且唯一的欄位 那麼會自動升級成主鍵(從上往下的第一個)
  		create table t23(
  			tid int,
  			pid int not null unique,
  			cid int not null unique
  		);
  """
  結論:建立表應該有一個序號欄位(id\pid\cid)並且應該將該欄位設定成主鍵
  create table t24(
    id int primary key,
    name varchar(32)
  );
  # 也可以有聯合主鍵(多個欄位組合 本質還是一個主鍵) 瞭解即可
  create table t24(
    id int,
    name varchar(32),
    pwd int,
    primary key(id,pwd)
  );

auto_increment (自增)

auto_increment  
  專門配合主鍵一起使用 使用者以後在新增資料的時候就不需要自己記憶主鍵值
  create table t25(
  	id int primary key auto_increment,
    name varchar(32)
  );
"""
總結
	以後在建立規範的表的時候
		一般都會有一個主鍵欄位的編寫如下
			id int primary key auto_increment
"""
自增特性

主鍵的自增特性(除truncate刪除資料並重置主鍵值)無法逆轉。

create table t1(
  id int primary key auto_increment,
  name varchar(32)
);
insert into t1(name) values('jason'),('kevin'),('tony');
insert into t1(name) values('oscar');  # id=4
delete from t1 where id=4;
insert into t1(name) values('oscar');  # id=5
'''自增不會隨著資料的刪除而回退'''
delete from t1;  # 刪除資料但無法重置主鍵
insert into t1(name) values('jason'),('kevin'),('tony');
truncate t1;  # 刪除資料並重置主鍵值
insert into t1(name) values('jason'),('kevin'),('tony');