MySQL知識集錦(一)

一、數(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ù)對象有
  1. database、schema、table、index
  2. view、trigger、function、procedure
2.唯一約束 與 外鍵約束
  1. 唯一約束(unique key):是一種特殊的索引,對table的某個字段或者多個字段設(shè)置唯一約束,保證在這個表里對應(yīng)的數(shù)據(jù)必須唯一。比如用戶ID、手機號、身份證號等,主鍵(primary key)也是一種唯一約束。
  2. 外鍵約束(Foreign key): 外鍵是指兩個table的數(shù)據(jù)通過某種條件關(guān)聯(lián)起來。
3.使用外鍵約束的注意事項
  1. 必須是InnoDB表,Myisam和其他存儲引擎不支持外鍵
  2. 相互約束的字段類型必須一樣
  3. 主表的約束字段要求有索引
  4. 約束名稱必須要唯一,即便不在一張表上
4.數(shù)據(jù)對象view的作用
  1. 簡化數(shù)據(jù)庫的訪問,將多個查詢語句結(jié)構(gòu)化為一個虛擬結(jié)構(gòu)
  2. 隱藏數(shù)據(jù)庫后端表結(jié)構(gòu),提高數(shù)據(jù)庫的安全性
  3. 視圖也是一種權(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)
  1. 權(quán)限信息存在mysql數(shù)據(jù)庫user表中
  2. MySQL賬號對應(yīng)的密碼也加密存儲在數(shù)據(jù)庫user表中
  3. 每一種權(quán)限類型在元數(shù)據(jù)里都是枚舉類型,表明是否有該權(quán)限
4.與權(quán)限相關(guān)的表有:user、db、tables_priv、columns_priv,權(quán)限驗證流程如下圖:
權(quán)限驗證流程.png

四、字符集(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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • MySQL數(shù)據(jù)庫對象與應(yīng)用 2.1-MySQL數(shù)據(jù)類型 庫建立好之后基本不動,和我們接觸最頻繁的是表. 建表就是聲...
    極客圈閱讀 2,258評論 0 8
  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應(yīng)用程序。每個數(shù)據(jù)庫具有一個或多個不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,143評論 0 19
  • 前段時間公司內(nèi)部博客上凱哥分享了一篇關(guān)于mysql字符集編碼的文章,之前我對mysql字符集一塊基本沒有深究過,看...
    __七把刀__閱讀 6,707評論 14 18
  • 2513-康康-彩鉛小助手
    Carmen康康閱讀 357評論 0 0
  • 長大后的我們才知道,王子和公主的故事,也可能有散場的結(jié)局。但幸好,即便如此,還是有寫童話的人。 “人生總有許多巧合...
    蘇洛seven閱讀 498評論 0 1

友情鏈接更多精彩內(nèi)容