一、數(shù)據(jù)類型
1. int(11) vs int(21)的區(qū)別?存儲空間,還是存儲范圍?
本質(zhì)上沒有任何區(qū)別,不管是存儲空間,還是存儲范圍,都是一樣的。
區(qū)別就是,比如存數(shù)據(jù)1,int(11)前面會補10個0,int(21)前面會補20個0
2. 數(shù)據(jù)類型:char varchar text 的區(qū)別?
1). char與varchar存儲的單位都是字符,text存儲單位是字節(jié),總大小為65535字節(jié),約為64KB
2). char存儲定長,容易造成空間的浪費, char數(shù)據(jù)類型最大為255字符
3). varchar存儲變長,節(jié)省存儲空間,可以存儲超過255字符
4). text在數(shù)據(jù)內(nèi)部大多存儲格式為溢出頁,效率不如char
3.字符與字節(jié)
1). 字節(jié)的單位是byte,衡量數(shù)據(jù)量的多少
2). 字符就是指在計算機使用的文字和符號而已
3). 它們之間的對應(yīng)關(guān)系跟采用的編碼技術(shù)有關(guān),在utf8中,1個漢字對應(yīng)3個字節(jié),1個字母對應(yīng)1個字節(jié)
4.時間類型:DATE、TIME、TIMESTAMP、DATETIME的區(qū)別
| 時間類型 | 存儲空間 | 存儲精度 | 存儲范圍 |
|---|---|---|---|
| DATE | 3字節(jié) | 年月日 | - |
| TIME | 3字節(jié) | 時分秒 | - |
| TIMESTAMP | 4字節(jié) | 年月日時分秒 | 1970-2038年 |
| DATETIME | 8字節(jié) | 年月日時分秒 | 1000-9999年 |
注:TIMESTAMP會根據(jù)系統(tǒng)時區(qū)進行轉(zhuǎn)換,DATETIME不會
二、數(shù)據(jù)對象
1.MySQL常見的數(shù)據(jù)對象有
- database、schema、table、index
- view、trigger、function、procedure
2.唯一約束 與 外鍵約束
- 唯一約束(unique key):是一種特殊的索引,對table的某個字段或者多個字段設(shè)置唯一約束,保證在這個表里對應(yīng)的數(shù)據(jù)必須唯一。比如用戶ID、手機號、身份證號等,主鍵(primary key)也是一種唯一約束。
- 外鍵約束(Foreign key): 外鍵是指兩個table的數(shù)據(jù)通過某種條件關(guān)聯(lián)起來。
3.使用外鍵約束的注意事項
- 必須是InnoDB表,Myisam和其他存儲引擎不支持外鍵
- 相互約束的字段類型必須一樣
- 主表的約束字段要求有索引
- 約束名稱必須要唯一,即便不在一張表上
4.數(shù)據(jù)對象view的作用
- 簡化數(shù)據(jù)庫的訪問,將多個查詢語句結(jié)構(gòu)化為一個虛擬結(jié)構(gòu)
- 隱藏數(shù)據(jù)庫后端表結(jié)構(gòu),提高數(shù)據(jù)庫的安全性
- 視圖也是一種權(quán)限管理,只對用戶提供部分數(shù)據(jù)
5.觸發(fā)器Trigger的作用:
可以在數(shù)據(jù)寫入表之前或者之后觸發(fā)一些其它操作
三、權(quán)限管理
1.如何新建一個用戶并授權(quán)?
下面的Grant語句會判斷是否存在該用戶,如果不存在則新建。下面是為tom這個用戶授權(quán)了select語句,with grant option就是允許tom把select這個權(quán)利授予給其它人
GRANT SELECT ON *.* TO 'tom'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
2.其它語句
show grants; //查看當(dāng)前用戶的權(quán)限
show grants for tom@'localhost'; //查看其它用戶的權(quán)限
revoke select from *.* on tom@'localhost'; //回收不需要的權(quán)限
grant insert on *.* to tom@'localhost'; //重新賦權(quán)
3.MySQL權(quán)限信息存儲結(jié)構(gòu)
- 權(quán)限信息存在mysql數(shù)據(jù)庫user表中
- MySQL賬號對應(yīng)的密碼也加密存儲在數(shù)據(jù)庫user表中
- 每一種權(quán)限類型在元數(shù)據(jù)里都是枚舉類型,表明是否有該權(quán)限
4.與權(quán)限相關(guān)的表有:user、db、tables_priv、columns_priv,權(quán)限驗證流程如下圖:

四、字符集(charset) 和字符序(collation)
1.數(shù)據(jù)庫中的字符集有兩層含義:一是各種文字的符號和集合;二是字符的編碼方式
2.MySQL字符集編碼分類:
ASCII(單字節(jié)編碼,僅能表示128個字符)
GBK(雙字節(jié)編碼)
UTF-8(可變長度字符編碼,使用1-4個字節(jié)為每個字符編碼)
latin1(默認字符集)
3.字符序的含義:
字符的排序與比較規(guī)則,每個字符集都有對應(yīng)的多套字符序。不同的字符序決定了字符串在比較排序中的精度和性能不同
4.mysql 的字符序遵從命名慣例:
_ci 表示大小寫不敏感
_cs 大小寫敏感
_bin 用編碼值進行比較
5.charset和collation的設(shè)置級別:
服務(wù)器級>>數(shù)據(jù)庫級>>表級>>列級

6.數(shù)據(jù)存儲字符集使用規(guī)則
- 使用列集的character set設(shè)定值
- 若列級字符集不存在,則使用對應(yīng)表級的default character set 設(shè)定值
- 若表級字符集不存在,則使用數(shù)據(jù)庫級的default character set 設(shè)定值
- 若數(shù)據(jù)庫級字符集不存在,則使用服務(wù)器級character_set_server設(shè)定值
7.客戶端連接與字符集
- character_set_client:客戶端來源數(shù)據(jù)使用的字符集
- character_set_connection:連接層字符集
- character_set_results:查詢結(jié)果字符集
推薦把它們?nèi)齻€統(tǒng)一設(shè)置成一致的字符集 mysql> set names utf8;
配置文件設(shè)置:[mysql] default-character-set = utf8
8.常見亂碼原因
- 數(shù)據(jù)存儲字符集不能正確編碼(不支持)client發(fā)來的數(shù)據(jù):client(utf8) -> storage(latin1)
-
程序連接使用的字符集與通知mysql的character_set_client等不一致或不兼容
客戶端連接與字符集.png
導(dǎo)入數(shù)據(jù)時,不用set names,而是用set character_set_database 與實際文件的編碼一樣
使用建議
- 創(chuàng)建數(shù)據(jù)庫/表時顯示的指定字符集,不使用默認
- 連接字符集與數(shù)據(jù)存儲字符集設(shè)置一致,推薦使用utf8
- 驅(qū)動程序連接時顯示指定字符集(set names xxx)
9.相關(guān)命令
//global可選,查看字符集
show [global] variables like 'character%';
//global可選,查看字符序
show [global] variables like 'collation%';;
//修改字符集
set global character_set_server=utf8;
alter table xxx convert to character set xxx;
//設(shè)置數(shù)據(jù)庫級的字符集和字符序,主要影響load data等語句的默認字符集
create database db_name character set latin1 collate latin1_swdish_ci
// 設(shè)置表級的字符集
create table tb_name default character=utf8 default collate=utf8_bin;
