day037MYSQL庫、表、行詳細操做

本節內容:

一、庫操做
二、表操做
三、行操做

1、庫操做

一、建立數據庫

1.1 語法

CREATE DATABASE 數據庫名 charset utf8;

1.2 數據庫命名規則

能夠由字母、數字、下劃線、@、#、$

區分大小寫

惟一性

不能使用關鍵字如 create select

不能單獨使用數字

最長128位

# 基本上跟python或者js的命名規則同樣

二、數據庫相關操做

也是一些基本操做,和咱們以前說的差很少。
1 查看數據庫
show databases;   # 顯示data目錄下的全部數據庫
show create database db1;
select database();

2 選擇數據庫(切換數據庫)
USE 數據庫名

3 刪除數據庫
DROP DATABASE 數據庫名;

4 修改數據庫
alter database db1 charset utf8;

五、如何返回data目錄下,
Mysql

關於庫的內容,有點少是吧,不是我們的重點,來看下面的表操做~~~html

2、表操做

一、存儲引擎(即表類型)

mysql根據不一樣的表類型會有不一樣的處理機制,

一、存儲引擎解釋

首先肯定一點,存儲引擎的概念是MySQL裏面纔有的,不是全部的關係型數據庫都有存儲引擎這個概念,
後面咱們還會說,可是如今要肯定這一點。

由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型
(即:對錶的存儲、操做等的實現方法不一樣),表是什麼,表本質上就是磁盤上的文件。

  其實MySQL支持多種存儲引擎,每種引擎有着一些本身獨特的功能,用戶在使用的時候,
能夠根據本身的業務場景來使用不一樣的存儲引擎,其中MySQL最經常使用的存儲引擎爲:MyISAM和InnoDB。
在詳細介紹這些存儲引擎以前,咱們先來看看MySQL的整個工做流程,看一下存儲引擎在哪裏,MySQL都作了哪些事情。前端

簡單的比喻
在講清楚什麼是存儲引擎以前,咱們先來個比喻,咱們都知道錄製一個視頻文件,能夠轉換成不一樣的格式,
例如mp4,avi,wmv等,而存在咱們電腦的磁盤上也會存在於不一樣類型的文件系統中如windows裏常見的ntfs、fat32,
存在於linux裏常見的ext3,ext4,xfs,可是,給咱們或者用戶看懂實際視頻內容都是同樣的。
直觀區別是,佔用系統的空間大小與清晰程度可能不同。

那麼數據庫表裏的數據存儲在數據庫裏及磁盤上和上述的視頻格式及存儲磁盤文件的系統格式特徵相似,也有不少種存儲方式。
可是對於用戶和應用程序來講一樣一張表的數據,不管用什麼引擎來存儲,用戶可以看到的數據是同樣的。
不一樣儲引擎存取,引擎功能,佔用空間大小,讀取性能等可能有區別。

說白了,存儲引擎就是在如何存儲數據、提取數據、更新數據等技術方法的實現上,底層的實現方式不一樣,
那麼就會呈現出不一樣存儲引擎有着一些本身獨有的特色和功能,對應着不一樣的存取機制。
Python

看下圖:這是我在MySQL官方手冊上拿下來的(手冊你若是可以玩好,未來你就能作一個NB的DBA~~~)

來,看每一個部分的解釋,看下圖:
node

二、MySQL存儲引擎分類

前面咱們對MySQL進行操做的時候並無指定存儲引擎,爲何還能用呢,沒有指定還能用,說明什麼,
說明MySQL默認有一個存儲引擎,
我記得MySQL5.5以前,默認的存儲引擎是MyISAM,以後都改成InnoDB了,
咱們的重點就是這個InnoDB,也是公司中最經常使用的、最好用的引擎,
可是仍是一些公司在用MyISAM引擎,
除了歷史緣由以外,還有MyISAM的效率比InnoDB高一點,
InnoDB在這方面作了不少優化,效率已經和MyISAM差很少了,
可是InnoDB引擎還有好多其餘的NB的功能,
下面咱們就介紹幾種存儲引擎。

首先看一下我們的默認存儲引擎:
python

查看引擎的幾種方法

一、show engines;#查看MySQL全部的引擎,
二、show variables like "storage_engine%";查看當前正在使用的引擎
 注意:在存儲大文件的時候,能夠存到數據庫,可是儘可能別直接存到數據庫裏面,會影響數據庫的效率,
 咱們就存文件的路徑、地址,用戶想要這個大文件,咱們能夠到對應的路徑下取讀取這個文件給用戶。

三、幾種經常使用引擎介紹

一、MyISAM引擎
MyISAM引擎特色
MyISAM引擎特色:
 1.不支持事務 事務是指邏輯上的一組操做,組成這組操做的各個單元,要麼全成功要麼全失敗。 2.表級鎖定 數據更新時鎖定整個表:其鎖定機制是表級鎖定,也就是對錶中的一個數據進行操做都會將這個表鎖定, 其餘人不能操做這個表,這雖然可讓鎖定的實現成本很小可是也同時大大下降了其併發性能。 3.讀寫互相阻塞 不只會在寫入的時候阻塞讀取,MyISAM還會再讀取的時候阻塞寫入,但讀自己並不會阻塞另外的讀。 4.只會緩存索引 MyISAM能夠經過key_buffer_size的值來提升緩存索引,以大大提升訪問性能減小磁盤IO, 可是這個緩存區只會緩存索引,而不會緩存數據。 5.讀取速度較快 佔用資源相對較少 6.不支持外鍵約束,但只是全文索引 7.MyISAM引擎是MySQL5.5版本以前的默認引擎,是對最初的ISAM引擎優化的產物。 
Python
MyISAM引擎適用的生產業務場景
MyISAM引擎適用的生產業務場景
 1.不須要事務支持的業務(例如轉帳就不行,充值也不行) 2.通常爲讀數據比較多的應用,讀寫都頻繁場景不適合,讀多或者寫多的都適合。 3.讀寫併發訪問都相對較低的業務(純讀純寫高併發也能夠)(鎖定機制問題) 4.數據修改相對較少的業務(阻塞問題) 5.以讀爲主的業務,例如:www.blog,圖片信息數據庫,用戶數據庫,商品庫等業務 6.對數據一致性要求不是很高的業務。 7.中小型的網站部分業務會用。 小結: 單一對數據庫的操做均可以示用MyISAM,所謂單一就是儘可能純讀,或純寫(insert,update,delete)等。 
Python
MyISAM引擎調優精要
MyISAM引擎調優精要
1.設置合適的索引(緩存機制)(where、join後面的列創建索引,重複值比較少的建索引等) 2.調整讀寫優先級,根據實際需求確保重要操做更優先執行,讀寫的時候能夠經過參數設置優先級。 3.啓用延遲插入改善大批量寫入性能(下降寫入頻率,儘量多條數據一次性寫入)。 4.儘可能順序操做讓insert數據都寫入到尾部,較少阻塞。 5.分解大的操做,下降單個操做的阻塞時間,就像操做系統控制cpu分片同樣。 6.下降併發數(減小對MySQL訪問),某些高併發場景經過應用進行排隊隊列機制Q隊列。 7.對於相對靜態(更改不頻繁)的數據庫數據,充分利用Query Cache(能夠經過配置文件配置)或memcached緩存服務能夠極大的提升訪問頻率。 8.MyISAM的Count只有在全表掃描的時候特別高效,帶有其餘條件的count都須要進行實際的數據訪問。 9.能夠把主從同步的主庫使用innodb,從庫使用MyISAM引擎。主庫寫,從庫讀能夠(不推薦,有些麻煩的地方,市場上有人這麼用)。 
Python
關於MyISAM的一些其餘介紹
不支持事務、表鎖設計、支持全文索引,主要面向一些 OLAP 數 據庫應用, 在 MySQL 5.5.8 版本以前是默認的存儲引擎(除 Windows 版本外)。 數據庫系統 與文件系統一個很大的不一樣在於對事務的支持,MyISAM 存儲引擎是不支持事務的。 究其根 本,這也並不難理解。用戶在全部的應用中是否都須要事務呢?在數據倉庫中, 若是沒有 ETL 這些操做,只是簡單地經過報表查詢還須要事務的支持嗎? 此外,MyISAM 存儲引擎的 另外一個不同凡響的地方是, 它的緩衝池只緩存(cache)索引文件,而不緩存數據文件,這與 大多數的數據庫都不相同。 
Python
2.InnoDB引擎
InnoDB引擎特色
InnoDB引擎
 介紹:InnoDB引擎是MySQL數據庫的另外一個重要的存儲引擎,
 正稱爲目前MySQL AB所發行新版的標準,被包含在全部二進制安裝包裏。
 和其餘的存儲引擎相比,InnoDB引擎的優勢是支持兼容ACID的事務(相似於PostGreSQL), 以及參數完整性(即對外鍵的支持)。Oracle公司與2005年10月收購了Innobase。Innobase採用雙認證受權。 它使用GNU發行,也容許其餘想將InnoDB結合到商業軟件的團體得到受權。 InnoDB引擎特色: 1.支持事務:支持4個事務隔離界別,支持多版本讀。 2.行級鎖定(更新時通常是鎖定當前行):經過索引實現,全表掃描仍然會是表鎖,注意間隙鎖的影響。 3.讀寫阻塞與事務隔離級別相關(有多個級別,這就不介紹啦~)。 4.具體很是高效的緩存特性:能緩存索引,也能緩存數據。 5.整個表和主鍵與Cluster方式存儲,組成一顆平衡樹。(瞭解) 6.全部SecondaryIndex都會保存主鍵信息。(瞭解) 7.支持分區,表空間,相似oracle數據庫。 8.支持外鍵約束,不支持全文索引(5.5以前),之後的都支持了。 9.和MyISAM引擎比較,InnoDB對硬件資源要求仍是比較高的。 小結: 三個重要功能:Supports transactions, row-level locking, and foreign keys 
Python
InnoDB引擎適用的生產業務場景
InnoDB引擎適用的生產業務場景
    1.須要事務支持(具備較好的事務特性,例銀行業務) 2.行級鎖定對高併發有很好的適應能力,但須要確保查詢是經過索引完成。 3.數據更新較爲頻繁的場景,如:BBS(論壇)、SNS(社交平臺)、微博等 4.數據一致性要求較高的業務,例如:充值轉帳,銀行卡轉帳。 5.硬件設備內存較大,能夠利用InnoDB較好的緩存能力來提升內存利用率, 儘量減小磁盤IO,能夠經過一些參數來設置,這個就不細講啦~~~ 6.相比MyISAM引擎,Innodb引擎更消耗資源,速度沒有MyISAM引擎快 
Python
InnoDB引擎調優精要
InnoDB引擎調優精要
1.主鍵儘量小,避免給Secondery index帶來過大的空間負擔。 2.避免全表掃描,由於會使用表鎖。 3.儘量緩存全部的索引和數據,提升響應速度,較少磁盤IO消耗。 4.在大批量小插入的時候,儘可能本身控制事務而不要使用autocommit自動提交,有開關能夠控制提交方式。 5合理設置innodb_flush_log_at_trx_commit參數值,不要過分追求安全性。 若是innodb_flush_log_at_trx_commit的值爲0,log buffer每秒就會被刷寫日誌文件到磁盤,提交事務的時候不作任何操做。 6.避免主鍵更新,由於這會帶來大量的數據移動。 能夠看一看InnoDB的重要參數學習一下。 
Python
關於InnoDB的一些其餘介紹
InnoDB 存儲引擎將數據放在一個邏輯的表空間中,這個表空間就像黑盒同樣由 InnoDB 存儲引擎自身來管理。 從 MySQL 4.1(包括 4.1)版本開始,能夠將每一個 InnoDB 存儲引擎的 表單獨存放到一個獨立的 ibd 文件中。 此外,InnoDB 存儲引擎支持將裸設備(row disk)用 於創建其表空間。 InnoDB 經過使用多版本併發控制(MVCC)來得到高併發性,而且實現了 SQL 標準 的 4 種隔離級別,默認爲 REPEATABLE 級別, 同時使用一種稱爲 netx-key locking 的策略來 避免幻讀(phantom)現象的產生。 除此以外,InnoDB 存儲引擎還提供了插入緩衝(insert buffer)、二次寫(double write)、 自適應哈希索引(adaptive hash index)、預讀(read ahead) 等高性能和高可用的功能。 對於表中數據的存儲,InnoDB 存儲引擎採用了彙集(clustered)的方式,每張表都是按 主鍵的順序進行存儲的, 若是沒有顯式地在表定義時指定主鍵,InnoDB 存儲引擎會爲每一 行生成一個 6 字節的 ROWID,並以此做爲主鍵。 InnoDB 存儲引擎是 MySQL 數據庫最爲經常使用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應用 已經證實了 InnoDB 存儲引擎具有高可用性、高性能以及高可擴展性。 對其 底層實現的掌握和理解也須要時間和技術的積累。 若是想深刻了解 InnoDB 存儲引擎的工做 原理、實現和應用,能夠參考《MySQL 技術內幕:InnoDB 存儲引擎》一書。 
Python
四、事務
簡單地說,事務就是指邏輯上的一組SQL語句操做,組成這組操做的各個SQL語句,
  執行時要麼全成功要麼全失敗。
事務的介紹及特性
事務介紹:
    簡單地說,事務就是指邏輯上的一組SQL語句操做,組成這組操做的各個SQL語句,執行時要麼全成功要麼全失敗。
例如:你給我轉帳5塊錢,流程以下 a.從你銀行卡取出5塊錢,剩餘計算money-5 b.把上面5塊錢打入個人帳戶上,我收到5塊,剩餘計算money+5. 上述轉帳的過程,對應的sql語句爲: update 你_account set money=money-5 where name='你'; update 我_account set money=money+5 where name='我'; 上述的兩條SQL操做,在事務中的操做就是要麼都執行,要麼都不執行,否則錢就對不上了。 這就是事務的原子性(Atomicity)。 事務的四大特性: 1.原子性(Atomicity) 事務是一個不可分割的單位,事務中的全部SQL等操做要麼都發生,要麼都不發生。 2.一致性(Consistency) 事務發生前和發生後,數據的完整性必須保持一致。 3.隔離性(Isolation) 當併發訪問數據庫時,一個正在執行的事務在執行完畢前,對於其餘的會話是不可見的, 多個併發事務之間的數據是相互隔離的。 也就是其餘人的操做在這個事務的執行過程當中是看不到這個事務的執行結果的, 也就是他們拿到的是這個事務執行以前的內容,等這個事務執行完才能拿到新的數據。 4.持久性(Durability) 一個事務一旦被提交,它對數據庫中的數據改變就是永久性的。若是出了錯誤,事務也不允撤銷,只能經過'補償性事務'。 事務的開啓: 數據庫默認事務是自動提交的,也就是發一條sql他就執行一條。 若是想多條sql放在一個事務中執行,則須要使用事務進行處理。 當咱們開啓一個事務,而且沒有提交,mysql會自動回滾事務。 或者咱們使用rollback命令手動回滾事務。 數據庫開啓事務的命令,咱們後面會講到~~~ 
Python
在介紹上面兩個引擎中涉及的兩個概念(OLTP和OLAP)的介紹

參考文章:mysql

五、其餘引擎的介紹
其餘引擎簡單介紹
#NDB 存儲引擎 2003 年,MySQL AB 公司從 Sony Ericsson 公司收購了 NDB 存儲引擎。 NDB 存儲引擎是一個集羣存儲引擎,相似於 Oracle 的 RAC 集羣,不過與 Oracle RAC 的 share everything 結構不一樣的是, 其結構是 share nothing 的集羣架構,所以能提供更高級別的 高可用性。 NDB 存儲引擎的特色是數據所有放在內存中(從 5.1 版本開始,能夠將非索引數 據放在磁盤上), 所以主鍵查找(primary key lookups)的速度極快,而且可以在線添加 NDB 數據存儲節點(data node)以便線性地提升數據庫性能。 因而可知,NDB 存儲引擎是高可用、 高性能、高可擴展性的數據庫集羣系統,其面向的也是 OLTP 的數據庫應用類型。 #Memory 存儲引擎 正如其名,Memory 存儲引擎中的數據都存放在內存中,數據庫重 啓或發生崩潰,表中的數據都將消失。 它很是適合於存儲 OLTP 數據庫應用中臨時數據的臨時表,也能夠做爲 OLAP 數據庫應用中數據倉庫的維度表。 Memory 存儲引擎默認使用哈希 索引,而不是一般熟悉的 B+ 樹索引。 #Infobright 存儲引擎 第三方的存儲引擎。其特色是存儲是按照列而非行的,所以很是 適合 OLAP 的數據庫應用。 其官方網站是 http://www.infobright.org/,上面有很多成功的數據 倉庫案例可供分析。 #NTSE 存儲引擎 網易公司開發的面向其內部使用的存儲引擎。 目前的版本不支持事務, 但提供壓縮、行級緩存等特性,不久的未來會實現面向內存的事務支持。 #BLACKHOLE 黑洞存儲引擎,能夠應用於主備複製中的分發主庫。 也能夠用來防網絡攻擊,dds攻擊, MySQL 數據庫還有不少其餘存儲引擎,上述只是列舉了最爲經常使用的一些引擎。 若是 你喜歡,徹底能夠編寫專屬於本身的引擎,這就是開源賦予咱們的能力,也是開源的魅 力所在。 
Python

四、存儲引擎的使用

一、建立表時指定引擎
create table innodb_t2(id int)engine=innodb;
二、在配置文件中指定默認的存儲引擎
linux:vim /etc/my.cnf   windows:my.ini文件
[mysqld]
default-storage-engine=INNODB  #配置默認引擎,如今用的mysql默認基本都是InnoDB,因此其實均可以不用配置了
innodb_file_per_table=1  #表示獨立表空間存儲,能夠不寫
三、不一樣引擎在建立表的時候生成文件的不一樣
建立四個表,分別使用innodb,myisam,memory,blackhole存儲引擎,進行插入數據測試

#下面是使用四個不一樣的引擎來建立的表
create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;

經過四種引擎來建立的表,咱們對照着其生成的文件來看一下區別,看下圖:

四、關於上面的文件做用介紹:
數據庫文件夾中各文件的做用
1.db.opt文件:用來記錄該庫的默認字符集編碼和字符集排序規則用的。 也就是說若是你建立數據庫指定默認字符集和排序規則, 那麼後續建立的表若是沒有指定字符集和排序規則,那麼該新建的表將採用db.opt文件中指定的屬性。 2.後綴名爲.frm的文件:這個文件主要是用來描述數據表結構(id,name字段等)和字段長度等信息 3.後綴名爲.ibd的文件:這個文件主要儲存的是採用獨立表儲存模式時儲存數據庫的數據信息和索引信息; 4.後綴名爲.MYD(MYData)的文件:從名字能夠看出, 這個是存儲數據庫數據信息的文件,主要是存儲採用獨立表儲存模式時存儲的數據信息; 5.後綴名爲.MYI的文件:這個文件主要儲存的是數據庫的索引信息; 6.ibdata1文件:主要做用也是儲存數據信息和索引信息,這個文件在mysql安裝目錄的data文件夾下。 從上面能夠看出,.ibd儲存的是數據信息和索引信息,ibdata1文件也是存儲數據信息和索引信息, .MYD和.MYI也是分別儲存數據信息和索引信息,那他們之間有什麼區別呢? 主要區別是再於數據庫的存儲引擎不同, 若是儲存引擎採用的是MyISAM,則生成的數據文件爲表名.frm、表名.MYD、表名的MYI; 而儲存引擎若是是innoDB,開啓了innodb_file_per_table=1,也就是採用獨立儲存的模式,生成的文件是表名.frm、表名.ibd, 若是採用共存儲模式的,數據信息和索引信息都存儲在ibdata1(在裏面進行分類,從外面看是一個文件)中; 在進行數據恢復的時候,若是用的是MYISAM數據引擎,那麼數據很好恢復,只要將相應.frm, .MYD, .MYI文件拷貝過去便可。 可是若是是innodb的話,則每個數據表都是一個單獨的文件,只將相應的.frm和.ibd文件拷貝過去是不夠的, 必須在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才能夠。 msyql人家設定的規則就是這樣存儲表的,使用人家的系統,就要理解人家的規則。 
Python
在Oracle 和SQL Server等全部數據存儲管理機制都是同樣的。
而MySql數據庫提供了多種存儲引擎。
用戶能夠根據不一樣的需求爲數據表選擇不一樣的存儲引擎,用戶也能夠根據本身的須要編寫本身的存儲引擎。

  Oracle中不存在引擎的概念,
數據處理大體能夠分紅兩大類:聯機事務處理OLTP(on-line transaction processing)、
聯機分析處理OLAP(On-Line Analytical Processing)。
OLTP是傳統的關係型數據庫的主要應用,主要是基本的、平常的事務處理,例如銀行交易。
OLAP是數據倉庫系統的主要應用,支持複雜的分析操做,側重決策支持,而且提供直觀易懂的查詢結果。linux

二、表介紹

表至關於文件,表中的一條記錄就至關於文件的一行內容,
表中的一條記錄有對應的標題,稱爲表的字段


第一行的id、name二、age是字段,,其他的,一行內容稱爲一條記錄。sql

三、建立表

一、建立表的語法

#語法:
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);

#注意:
1. 在同一張表中,字段名是不能相同
2. 寬度和約束條件可選、非必須,寬度指的就是字段長度約束,例如:char(10)裏面的10
3. 字段名和類型是必須的

fe:代碼示例

代碼示例
mysql> create database db1 charset utf8;

mysql> use db1;

mysql> create table t1(
    -> id int,
    -> name varchar(50),
    -> sex enum('male','female'),
    -> age int(3)
    -> );

mysql> show tables; #查看db1庫下全部表名

mysql> desc t1;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(50)           | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+

mysql> select id,name,sex,age from t1;
Empty set (0.00 sec)

mysql> select * from t1;
Empty set (0.00 sec)

mysql> select id,name from t1;
Empty set (0.00 sec)
Mysql

fe:插入數據

插入數據
mysql> insert into t1 values -> (1,'chao',18,'male'), -> (2,'sb',81,'female') -> ; mysql> select * from t1; +------+------+------+--------+ | id | name | age | sex | +------+------+------+--------+ | 1 | chao | 18 | male | | 2 | sb | 81 | female | +------+------+------+--------+ mysql> insert into t1(id) values -> (3), -> (4); mysql> select * from t1; +------+------+------+--------+ | id | name | age | sex | +------+------+------+--------+ | 1 | chao | 18 | male | | 2 | sb | 81 | female | | 3 | NULL | NULL | NULL | | 4 | NULL | NULL | NULL | +------+------+------+--------+ 
Python

四、查看錶結構

mysql> describe t1; #查看錶結構,可簡寫爲:desc 表名
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(50)           | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+


mysql> show create table t1\G; #查看錶詳細結構,可加\G

五、MySQL的基礎數據類型

一、介紹

存儲引擎決定了表的類型,而表內存放的數據也要有不一樣的類型,
每種數據類型都有本身的寬度,但寬度是可選的

詳細參考:
MySQL數據類型
官網介紹數據庫

mysql經常使用數據類型概覽:

#1. 數字:
    整型:tinyinit  int  bigint
    小數:
        float :在位數比較短的狀況下不精準
        double :在位數比較長的狀況下不精準
            0.000001230123123123
            存成:0.000001230000

        decimal:(若是用小數,則用推薦使用decimal)
            精準
            內部原理是以字符串形式去存

#2. 字符串:
    char(10):簡單粗暴,浪費空間,存取速度快
        root存成root000000
    varchar:精準,節省空間,存取速度慢

    sql優化:建立表時,定長的類型往前放,變長的日後放
                    好比性別           好比地址或描述信息

    >255個字符,超了就把文件路徑存放到數據庫中。
            好比圖片,視頻等找一個文件服務器,數據庫中只存路徑或url。

#3. 時間類型:
    最經常使用:datetime

#4. 枚舉類型與集合類型
Mysql

二、數值類型

注意:對於整型來講,數據類型後面的寬度並非存儲長度限制,而是顯示限制,
假如:int(8),那麼顯示時不夠8位則用0來填充,夠8位則正常顯示,
經過zerofill來測試,存儲長度仍是int的4個字節長度。
默認的顯示寬度就是可以存儲的最大的數據的長度,
好比:int無符號類型,那麼默認的顯示寬度就是int(10),有符號的就是int(11),
由於多了一個符號,
因此咱們沒有必要指定整數類型的數據,不必指定寬度,
由於默認的就可以將你存的原始數據徹底顯示

1.整數類型
整數類型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
做用:存儲年齡,等級,id,各類號碼等
fe:設置有無符號,默認有符號
默認有,create table t1(x tinyint)
create table t2(x tinyint unsigned);  (加了unsigned,就是無符號)
設置有無符號示例
1.tinyint默認爲有符號 mysql> create table t1(x tinyint); #默認爲有符號,即數字前有正負號 mysql> desc t1; mysql> insert into t1 values -> (-129), -> (-128), -> (127), -> (128); mysql> select * from t1; +------+ | x | +------+ | -128 | #-129存成了-128 | -128 | #有符號,最小值爲-128 | 127 | #有符號,最大值127 | 127 | #128存成了127 +------+ 2.設置無符號tinyint mysql> create table t2(x tinyint unsigned); (加了unsigned,就是無符號) mysql> insert into t2 values -> (-1), -> (0), -> (255), -> (256); mysql> select * from t2; +------+ | x | +------+ | 0 | -1存成了0 | 0 | #無符號,最小值爲0 | 255 | #無符號,最大值爲255 | 255 | #256存成了255 +------+ 用zerofill測試整數類型的顯示寬度 mysql> create table t7(x int(3) zerofill); mysql> insert into t7 values -> (1), -> (11), -> (111), -> (1111); mysql> select * from t7; +------+ | x | +------+ | 001 | | 011 | | 111 | | 1111 | #超過寬度限制仍然能夠存 
Python

MySQL的mode設置

MySQL的mode設置vim

二、浮點型
定點數類型  DEC,等同於DECIMAL  
浮點類型:FLOAT DOUBLE
做用:存儲薪資、身高、溫度、體重、體質參數等
三種浮點型數介紹
三種浮點型數介紹
1.FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 定義: 單精度浮點數(非準確小數值),m是整數部分總個數,d是小數點後個數。m最大值爲255,d最大值爲30,例如:float(255,30) 有符號: -3.402823466E+38 to -1.175494351E-38, 1.175494351E-38 to 3.402823466E+38 無符號: 1.175494351E-38 to 3.402823466E+38 精確度: **** 隨着小數的增多,精度變得不許確 **** 2.DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 定義: 雙精度浮點數(非準確小數值),m是整數部分總個數,d是小數點後個數。m最大值也爲255,d最大值也爲30 有符號: -1.7976931348623157E+308 to -2.2250738585072014E-308 2.2250738585072014E-308 to 1.7976931348623157E+308 無符號: 2.2250738585072014E-308 to 1.7976931348623157E+308 精確度: ****隨着小數的增多,精度比float要高,但也會變得不許確 **** 3.decimal[(m[,d])] [unsigned] [zerofill] 定義: 準確的小數值,m是整數部分總個數(負號不算),d是小數點後個數。 m最大值爲65,d最大值爲30。比float和double的整數個數少,可是小數位數都是30位 精確度: **** 隨着小數的增多,精度始終準確 **** 對於精確數值計算時須要用此類型 decimal可以存儲精確值的緣由在於其內部按照字符串存儲。 精度從高到低:decimal、double、float decimal精度高,可是整數位數少 float和double精度低,可是整數位數多 float已經知足絕大多數的場景了,可是什麼導彈、航線等要求精度很是高, 因此仍是須要按照業務場景自行選擇,若是又要精度高又要整數位數多,那麼你能夠直接用字符串來存。 
Python
三、位類型(瞭解,不講
BIT(M)能夠用來存放多位二進制數,M範圍從1~64,若是不寫默認爲1位。
注意:對於位字段須要使用函數讀取
bin()顯示爲二進制
hex()顯示爲十六進制
位類型測試
mysql> create table t9(id bit); mysql> desc t9; #bit默認寬度爲1 +-------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+-------+ | id | bit(1) | YES | | NULL | | +-------+--------+------+-----+---------+-------+ mysql> insert into t9 values(8); mysql> select * from t9; #直接查看是沒法顯示二進制位的 +------+ | id | +------+ | | +------+ mysql> select bin(id),hex(id) from t9; #須要轉換才能看到 +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | +---------+---------+ mysql> alter table t9 modify id bit(5); mysql> insert into t9 values(8); mysql> select bin(id),hex(id) from t9; +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | | 1000 | 8 | +---------+---------+ 
Python

三、日期類型

類型:DATE,TIME,DATETIME ,IMESTAMP,YEAR
做用:存儲用戶註冊時間,文章發佈時間,員工入職時間,出生時間,過時時間等
日期類型分類
YEAR
YYY(範圍:1901/2155)2018 DATE YYYY-MM-DD(範圍:1000-01-01/9999-12-31)例:2018-01-01 TIME HH:MM:SS(範圍:'-838:59:59'/'838:59:59')例:12:09:32 DATETIME YYYY-MM-DD HH:MM:SS(範圍:1000-01-01 00:00:00/9999-12-31 23:59:59 Y)例: 2018-01-01 12:09:32 TIMESTAMP YYYYMMDD HHMMSS(範圍:1970-01-01 00:00:00/2037 年某時) 
Python
日期類型測試
year:
    mysql> create table t10(born_year year); #不管year指定何種寬度,最後都默認是year(4) mysql> insert into t10 values -> (1900), -> (1901), -> (2155), -> (2156); mysql> select * from t10; +-----------+ | born_year | +-----------+ | 0000 | | 1901 | | 2155 | | 0000 | +-----------+ date,time,datetime: mysql> create table t11(d date,t time,dt datetime); mysql> desc t11; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | d | date | YES | | NULL | | | t | time | YES | | NULL | | | dt | datetime | YES | | NULL | | +-------+----------+------+-----+---------+-------+ mysql> insert into t11 values(now(),now(),now()); mysql> select * from t11; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2017-07-25 | 16:26:54 | 2017-07-25 16:26:54 | +------------+----------+---------------------+ timestamp: mysql> create table t12(time timestamp); mysql> insert into t12 values(); mysql> insert into t12 values(null); mysql> select * from t12; +---------------------+ | time | +---------------------+ | 2017-07-25 16:29:17 | | 2017-07-25 16:30:01 | +---------------------+ ============注意啦,注意啦,注意啦=========== 1. 單獨插入時間時,須要以字符串的形式,按照對應的格式插入 2. 插入年份時,儘可能使用4位值 3. 插入兩位年份時,<=69,以20開頭,好比50, 結果2050 >=70,以19開頭,好比71,結果1971 mysql> create table t12(y year); mysql> insert into t12 values -> (50), -> (71); mysql> select * from t12; +------+ | y | +------+ | 2050 | | 1971 | +------+ 
Python

mysql的日期格式對字符串採用的是’放鬆’政策,能夠以字符串的形式插入。

datetime與timestamp的區別
在實際應用的不少場景中,MySQL的這兩種日期類型都可以知足咱們的須要,存儲精度都爲秒,
但在某些狀況下,會展示出他們各自的優劣。下面就來總結一下兩種日期類型的區別。

1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。 2.DATETIME存儲時間與時區無關,TIMESTAMP存儲時間與時區有關,顯示的值也依賴於時區。 在mysql服務器,操做系統以及客戶端鏈接都有時區的設置。 3.DATETIME使用8字節的存儲空間,TIMESTAMP的存儲空間爲4字節。 所以,TIMESTAMP比DATETIME的空間利用率更高。 4.DATETIME的默認值爲null;TIMESTAMP的字段默認不爲空(not null), 默認值爲當前時間(CURRENT_TIMESTAMP),若是不作特殊處理,而且update語句中沒有指定該列的更新值,則默認更新爲當前時間。 
Python

工做中通常都用datetime就能夠了。 

對上面datetime與timestamp的區別中第四條的驗證
mysql> create table t1(x datetime not null default now()); # 須要指定傳入空值時默認取當前時間 Query OK, 0 rows affected (0.01 sec) mysql> create table t2(x timestamp); # 無需任何設置,在傳空值的狀況下自動傳入當前時間 Query OK, 0 rows affected (0.02 sec) mysql> insert into t1 values(); Query OK, 1 row affected (0.00 sec) mysql> insert into t2 values(); Query OK, 1 row affected (0.00 sec) mysql> select * from t1; +---------------------+ | x | +---------------------+ | 2018-07-07 01:26:14 | +---------------------+ 1 row in set (0.00 sec) mysql> select * from t2; +---------------------+ | x | +---------------------+ | 2018-07-07 01:26:17 | +---------------------+ 1 row in set (0.00 sec) 
Python

四、字符串類型

類型:char,固定長度
varchar  可變長度

  做用:名字,信息等等

length(字段):查看該字段數據的字節長度

char_length(字段):查看該字段數據的字符長度
char和varchar的介紹
#官網:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括號內的參數指的都是字符的長度 #char類型:定長,簡單粗暴,浪費空間,存取速度快 字符長度範圍:0-255(一箇中文是一個字符,是utf8編碼的3個字節) 存儲: 存儲char類型的值時,會往右填充空格來知足長度 例如:指定長度爲10,存>10個字符則報錯(嚴格模式下),存<10個字符則用空格填充直到湊夠10個字符存儲 檢索: 在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,若是你想看到它補全空格以後的內容, 除非咱們打開pad_char_to_full_length SQL模式(SET sql_mode = 'strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';) #varchar類型:變長,精準,節省空間,存取速度慢 字符長度範圍:0-65535(若是大於21845會提示用其餘類型 。 mysql行最大限制爲65535字節,字符編碼爲utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html) 存儲: varchar類型存儲數據的真實內容,不會用空格填充,若是'ab ',尾部的空格也會被存起來 強調:varchar類型會在真實數據前加1-2Bytes的前綴, 該前綴用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用) 若是真實的數據<255bytes則須要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字爲255) 若是真實的數據>255bytes則須要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字爲65535) 檢索: 尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容 
Python
char和varchar測試
建立一個t1表,包含一個char類型的字段
create table t1(id int,name char(4)); 超過長度: 嚴格模式下(報錯): mysql> insert into t1 values('xiaoshabi'); ERROR 1406 (22001): Data too long for column 'name' at row 1 非嚴格模式下(警告): mysql> set sql_mode='NO_ENGINE_SUBSTITUTION'; Query OK, 0 rows affected (0.00 sec) mysql> create table t1(id int,name char(4)); Query OK, 0 rows affected (0.40 sec) mysql> insert into t2 values('xiaoshabi'); Query OK, 1 row affected, 1 warning (0.11 sec) 查看一下結果: mysql> select * from t1; +------+------+ | id | name | +------+------+ | 1 | xiao | #只有一個xiao +------+------+ 1 row in set (0.00 sec) varchar類型和上面的效果是同樣的,嚴格模式下也會報錯。 若是沒有超過長度,那麼char類型時mysql會使用空格來補全本身規定的char(4)的4個字符,varchar不會,咱們來作個對比 例如: #再建立一個含有varchar類型的表t2 而後插入幾條和t1裏面相同的數據 mysql>insert into t1 values(2,'a'),(3,'bb'),(4,'ccc'),(5,'d'); mysql>create table t2(id int,name varchar(4)); mysql> insert into t2 values(1,'xiao'),(2,'a'),(3,'bb'),(4,'ccc'),(5,'d'); 查看一下t1表和t2表的內容 mysql> select * from t1; +------+------+ | id | name | +------+------+ | 1 | xiao | | 2 | a | | 3 | bb | | 4 | ccc | | 5 | d | +------+------+ 5 rows in set (0.00 sec) mysql> select * from t2; +------+------+ | id | name | +------+------+ | 1 | xiao | | 2 | a | | 3 | bb | | 4 | ccc | | 5 | d | +------+------+ 5 rows in set (0.00 sec) 好,兩個表裏面數據是同樣的,每一項的數據長度也是同樣的, 那麼咱們來驗證一下char的自動空格在後面補全的存儲方式和varchar的不一樣 經過mysql提供的一個char_length()方法來查看一下全部數據的長度 mysql> select char_length(name) from t1; +-------------------+ | char_length(name) | +-------------------+ | 4 | | 1 | | 2 | | 3 | | 1 | +-------------------+ 5 rows in set (0.00 sec) mysql> select char_length(name) from t2; +-------------------+ | char_length(name) | +-------------------+ | 4 | | 1 | | 2 | | 3 | | 1 | +-------------------+ 5 rows in set (0.00 sec) 經過查看結果能夠看到,二者顯示的數據長度是同樣的,不是說好的char會補全嗎, 我設置的字段是char(4),那麼長度應該都是4纔對啊?這是由於mysql在你查詢的時候自動幫你把結果裏面的空格去掉了, 若是咱們想看到它存儲數據的真實長度,須要設置mysql的模式,經過一個叫作PAD_CHAR_TO_FULL_LENGTH的模式,就能夠看到了,因此咱們把這個模式加到sql_mode裏面: mysql> set sql_mode='PAD_CHAR_TO_FULL_LENGTH'; Query OK, 0 rows affected (0.00 sec) 而後咱們在查看一下t1和t2數據的長度: mysql> select char_length(name) from t1; +-------------------+ | char_length(name) | +-------------------+ | 4 | | 4 | | 4 | | 4 | | 4 | +-------------------+ 5 rows in set (0.00 sec) mysql> select char_length(name) from t2; +-------------------+ | char_length(name) | +-------------------+ | 4 | | 1 | | 2 | | 3 | | 1 | +-------------------+ 5 rows in set (0.00 sec) 經過結果能夠看到,char類型的數據長度都是4,這下看到了二者的不一樣了吧,至於爲何mysql會這樣搞,咱們後面有解釋的,先看現象就能夠啦。 如今咱們再來看一個問題,就是當你設置的類型爲char的時候,咱們經過where條件來查詢的時候會有一個什麼現象: mysql> select * from t1 where name='a'; +------+------+ | id | name | +------+------+ | 2 | a | +------+------+ 1 row in set (0.00 sec) ok,結果沒問題,咱們在where後面的a後面加一下空格再來試試: mysql> select * from t1 where name='a '; +------+------+ | id | name | +------+------+ | 2 | a | +------+------+ 1 row in set (0.00 sec) ok,能查到,再多加一些空格試試,加6個空格,超過了設置的char(4)的4: mysql> select * from t1 where name='a '; +------+------+ | id | name | +------+------+ | 2 | a | +------+------+ 1 row in set (0.00 sec) ok,也是沒問題的 總結:經過>,=,>=,<,<=做爲where的查詢條件的時候,char類型字段的查詢是沒問題的。 可是,當咱們將where後面的比較符號改成like的時候,(like是模糊匹配的意思, 咱們前面見過,show variables like '%char%';來查看mysql字符集的時候用過) 其中%的意思是匹配任意字符(0到多個字符均可以匹配到),還有一個符號是_(匹配1個字符), 這兩個字符其實就像咱們學的正則匹配裏面的通配符, 那麼咱們經過這些符號進行一下模糊查詢,看一下,char類型進行模糊匹配的時候,是否還能行,看例子: mysql> select * from t1 where name like 'a'; Empty set (0.00 sec) 發現啥也沒查到,由於char存儲的數據是4個字符長度的,不滿4個是以空格來補全的,你在like後面就只寫了一個'a',是沒法查到的。 咱們試一下上面的通配符來查詢: mysql> select * from t1 where name like 'a%'; +------+------+ | id | name | +------+------+ | 2 | a | +------+------+ 1 row in set (0.00 sec) 這樣就能看到查詢結果了 試一下_是否是匹配1個字符: mysql> select * from t1 where name like 'a_'; Empty set (0.00 sec) 發現一個_果真不行,咱們試試三個_。 mysql> select * from t1 where name like 'a___'; +------+------+ | id | name | +------+------+ | 2 | a | +------+------+ 1 row in set (0.00 sec) 發現果真能行,一個_最多匹配1個任意字符。 若是多寫了幾個_呢? mysql> select * from t1 where name like 'a_____'; Empty set (0.00 sec) 查不到結果,說明_匹配的是1個字符,但不是0-1個字符。 
Python
char和varchar測試結果總結:

  針對char類型,mysql在存儲的時候會將不足規定長度的數據使用後面(右邊補全)補充空格的形式進行補全,
而後存放到硬盤中,可是在讀取或者使用的時候會自動去掉它給你補全的空格內容,
由於這些空格並非咱們本身存儲的數據,因此對咱們使用者來講是無用的。

一、char和varchar性能對比:
char
以char(5)和varchar(5)來比較,加入我要存三我的名:sb,ssb1,ssbb2
char:
    優勢:簡單粗暴,無論你是多長的數據,我就按照規定的長度來存,
    5個5個的存,三我的名就會相似這種存儲:sb ssb1 ssbb2,
    中間是空格補全,取數據的時候5個5個的取,簡單粗暴速度快

    缺點:貌似浪費空間,而且咱們未來存儲的數據的長度可能會良莠不齊

varchar:
    varchar類型不定長存儲數據,更爲精簡和節省空間
    例如存上面三我的名的時候相似因而這樣的:sbssb1ssbb2,連着的,
    若是這樣存,請問這三我的名你還怎麼取出來,
    你知道取多長能取出第一個嗎?(,我能看出來啊,那我只想說:滾犢子!)

    不知道從哪開始從哪結束,遇到這樣的問題,你會想到怎麼解決呢?
    還記的嗎?想一想?socket?tcp?struct?把數據長度做爲消息頭。

    因此,varchar在存數據的時候,會在每一個數據前面加上一個頭,這個頭是1-2個bytes的數據,
    這個數據指的是後面跟着的這個數據的長度,1bytes能表示2**8=256,兩個bytes表示2**16=65536,
    能表示0-65535的數字,因此varchar在存儲的時候是這樣的:1bytes+sb+1bytes+ssb1+1bytes+ssbb2,
    因此存的時候會比較麻煩,致使效率比char慢,取的時候也慢,先拿長度,再取數據。

    優勢:節省了一些硬盤空間,一個acsii碼的字符用一個bytes長度就能表示,
    可是也並不必定比char省,看一下官網給出的一個表格對比數據,
    當你存的數據正好是你規定的字段長度的時候,varchar反而佔用的空間比char要多。

Value   CHAR(4) Storage Required    VARCHAR(4)  Storage Required
''  '    '  4 bytes ''  1 byte
'ab'    'ab  '  4 bytes 'ab'    3 bytes
'abcd'  'abcd'  4 bytes 'abcd'  5 bytes
'abcdefgh'  'abcd'  4 bytes 'abcd'  5 bytes
        
    缺點:存取速度都慢

 總結:
  因此須要根據業務需求來選擇用哪一種類型來存
  其實在多數的用戶量少的工做場景中char和varchar效率差異不是很大,最起碼給用戶的感知不是很大,
    而且其實軟件級別的慢遠比不上硬件級別的慢,因此大家公司的運維發現項目慢的時候會加內存、換nb的硬盤,
    項目的效率提高的會不少,可是咱們做爲專業人士,咱們應該提出來這樣的技術點來提升效率。

  可是對於InnoDB數據表,內部的行存儲格式沒有區分固定長度和可變長度列(全部數據行都使用指向數據列值的頭指針),
    所以在本質上,使用固定長度的CHAR列不必定比使用可變長度VARCHAR列性能要好。
    於是,主要的性能因素是數據行使用的存儲總量。
    因爲CHAR平均佔用的空間多於VARCHAR,
    所以使用VARCHAR來最小化須要處理的數據行的存儲總量和磁盤I/O是比較好的。

 因此啊,兩個選哪一個均可以,若是是大型併發項目,追求高性能的時候,
  須要結合大家服務器的硬件環境來進行測試,看一下char和varchar哪一個更好,這也能算一個優化的點吧~~~~
Char
varchar
#官網:https://dev.mysql.com/doc/refman/5.7/en/char.html CHAR 和 VARCHAR 是最常使用的兩種字符串類型。 通常來講 CHAR(N)用來保存固定長度的字符串,對於 CHAR 類型,N 的範圍 爲 0 ~ 255 VARCHAR(N)用來保存變長字符類型,對於 VARCHAR 類型,N 的範圍爲 0 ~ 65 535 CHAR(N)和 VARCHAR(N) 中的 N 都表明字符長度,而非字節長度。 ps:對於 MySQL 4.1 以前的版本,如 MySQL 3.23 和 MySQL 4.0,CHAR(N)和 VARCHAR (N)中的 N 表明字節長度。 #CHAR類型 對於 CHAR 類型的字符串,MySQL 數據庫會自動對存儲列的右邊進行填充(Right Padded)操做, 直到字符串達到指定的長度 N。而在讀取該列時,MySQL 數據庫會自動將 填充的字符刪除。 有一種狀況例外,那就是顯式地將 SQL_MODE 設置爲 PAD_CHAR_TO_ FULL_LENGTH,例如: mysql> CREATE TABLE t ( a CHAR(10)); Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO t SELECT 'abc'; Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT a,HEX(a),LENGTH(a) FROM t\G; *************************** 1. row *************************** a: abc HEX(a): 616263 LENGTH (a): 3 1 row in set (0.00 sec) mysql> SET SQL_MODE='PAD_CHAR_TO_FULL_LENGTH'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT a,HEX(a),LENGTH(a) FROM t\G; *************************** 1. row *************************** a: abc HEX(a): 61626320202020202020 LENGTH (a): 10 1 row in set (0.00 sec) 在上述這個例子中,先建立了一張表 t,a 列的類型爲 CHAR(10)。 而後經過 INSERT語句插入值「abc」,由於 a 列的類型爲 CHAR 型,因此會自動在後面填充空字符串, 使其長 度爲 10。接下來在經過 SELECT 語句取出數據時會將 a 列右填充的空字符移除, 從而獲得 值「abc」。經過 LENGTH 函數看到 a 列的字符長度爲 3 而非 10。 接着咱們將 SQL_MODE 顯式地設置爲 PAD_CHAR_TO_FULL_LENGTH。 這時再經過 SELECT 語句進行查詢時,獲得的結果是「abc 」, abc 右邊有 7 個填充字符 0x20,並通 過 HEX 函數獲得了驗證。 此次 LENGTH 函數返回的長度爲 10。須要注意的是,LENGTH 函數返回的是字節長度,而不是字符長度。 對於多字節字符集,CHAR(N)長度的列最多 可佔用的字節數爲該字符集單字符最大佔用字節數 *N。 例如,對於 utf8 下,CHAR(10)最 多可能佔用 30 個字節。 經過對多字節字符串使用 CHAR_LENGTH 函數和 LENGTH 函數, 能夠發現二者的不一樣,示例以下: mysql> SET NAMES gbk; Query OK, 0 rows affected (0.03 sec) mysql> SELECT @a:='MySQL 技術內幕 '; Query OK, 0 rows affected (0.03 sec) mysql> SELECT @a,HEX(@a),LENGTH(@a),CHAR_LENGTH(@a)\G; ***************************** 1. row **************************** a: MySQL 技術內幕 HEX(a): 4D7953514CBCBCCAF5C4DAC4BB LENGTH (a): 13 CHAR_LENGTH(a): 9 1 row in set (0.00 sec) 變 量 @ a 是 g b k 字 符 集 的 字 符 串 類 型 , 值 爲 「 M y S Q L 技 術 內 幕 」, 十 六 進 制 爲 0x4D7953514CBCBCCAF5C4DAC4BB,LENGTH 函數返回 13,即該字符串佔用 13 字節, 由於 gbk 字符集中的中文字符佔用兩個字節,所以一共佔用 13 字節。CHAR_LENGTH 函數 返回 9,很顯然該字符長度爲 9。 #VARCHAR類型 VARCHAR 類型存儲變長字段的字符類型,與 CHAR 類型不一樣的是,其存儲時須要在 前綴長度列表加上實際存儲的字符, 該字符佔用 1 ~ 2 字節的空間。當存儲的字符串長度小 於 255 字節時,其須要 1 字節的空間, 當大於 255 字節時,須要 2 字節的空間。因此,對 於單字節的 latin1 來講, CHAR(10)和 VARCHAR(10)最大佔用的存儲空間是不一樣的, CHAR(10)佔用 10 個字節這是毫無疑問的, 而 VARCHAR(10)的最大佔用空間數是 11 字節,由於其須要 1 字節來存放字符長度。 ------------------------------------------------- 注意 對於有些多字節的字符集類型,其 CHAR 和 VARCHAR 在存儲方法上是同樣的, 一樣 須要爲長度列表加上字符串的值。 對於 GBK 和 UTF-8 這些字符類型,其有些字符是以 1 字節 存放的, 有些字符是按 2 或 3 字節存放的,所以一樣須要 1 ~ 2 字節的空間來存儲字符的長 度。 ------------------------------------------------- 雖然 CHAR 和 VARCHAR 的存儲方式不太相同,可是對於兩個字符串的比較,都只比 較其值, 忽略 CHAR 值存在的右填充,即便將 SQL _MODE 設置爲 PAD_CHAR_TO_FULL_ LENGTH 也同樣,例如: mysql> CREATE TABLE t ( a CHAR(10), b VARCHAR(10)); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO t SELECT 'a','a'; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT a=b FROM t\G; *************************** 1. row *************************** a=b: 1 1 row in set (0.00 sec) mysql> SET SQL_MODE='PAD_CHAR_TO_FULL_LENGTH'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT a=b FROM t\G; *************************** 1. row *************************** a=b: 1 1 row in set (0.00 sec) 
Bash
二、其餘類型簡單介紹
其餘類型簡單介紹
4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不一樣。
有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 類型,可存儲的最大長度不一樣,可根據實際狀況選擇。

BLOB:
     1._BLOB和_text存儲方式不一樣,_TEXT以文本方式存儲,英文存儲區分大小寫,而_Blob是以二進制方式存儲,不分大小寫。
     2._BLOB存儲的數據只能總體讀出。
     3._TEXT能夠指定字符集,_BLO不用指定字符集。
Bash

五、枚舉類型與集合類型

字段的值只能在給定範圍中選擇,如單選框,多選框,
若是你在應用程序或者前端不作選項限制,在MySQL的字段裏面也能作限制

  enum 單選 只能在給定的範圍內選一個值,如性別 sex 男male/女female
  set 多選 在給定的範圍內能夠選擇一個或一個以上的值(愛好1,愛好2,愛好3…)

枚舉類型(enum)
    An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
     示例:
      CREATE TABLE shirts (
       name VARCHAR(40),
       size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
       );
       INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');



集合類型(set)
    A SET column can have a maximum of 64 distinct members.
 示例:
    CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
    INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Mysql
測試
mysql> create table consumer( -> name varchar(50), -> sex enum('male','female'), -> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定範圍內,多選一 -> hobby set('play','music','read','study') #在指定範圍內,多選多 -> ); mysql> insert into consumer values -> ('xiaogui','male','vip5','read,study'), -> ('taibai','female','vip1','girl'); mysql> select * from consumer; +------+--------+-------+------------+ | name | sex | level | hobby | +------+--------+-------+------------+ | xiaogui | male | vip5 | read,study | | taibai | female | vip1 | | +------+--------+-------+------------+
相關文章
相關標籤/搜索