## 字符串類型
#### char
定長字符:指定長度之后,系統一定會分配指定的空間用于存儲數據.
基本語法:char(L),L代表**字符數**(中文與英文字母一樣),L長度為0到255.
#### varchar
變長字符:指定長度之后,系統會根據實際存儲的數據來計算長度,分配合適的長度(數據沒有超出長度)
基本語法:Varchar(L),L代表字符數,L的長度理論值位0到65535.
1. char一定會使用指定的空間,varchar是根據數據來定空間.
2. char的數據查詢效率比varchar高:varchar是需要通過后面的記錄數來計算.
3. 如果確定數據一定是占指定長度,那么使用char類型,如果不確定數據到底有多少,那么使用varchar類型,如果數據長度超過255個字符,不論是否固定長度,都會使用text,不再使用char和varchar.
4. 因為varchar要記錄數據長度(系統根據數據長度自動分配空間),所以每個varchar數據產生后,系統都會在數據后面增加1-2個**字節**的額外開銷:是用來保存數據所占用的空間長度如果數據本身小于127個**字符**:額外開銷一個**字節**;如果大于127個,就開銷兩個**字節**.
#### char和varchar數據存儲對比(utf8,一個字符都會占用3個字節,gbk一個字符占用2個字節)
| 存儲數據 |char(2) | varchar(2) | char所占字節 |varchar所占字節 |
| --- | --- | --- | --- | --- |
| A | A |A | 2* 3 = 6 | 1 * 3 +1 = 4 |
char因為是定長,所以肯定用了兩個字符去存儲,而varchar是不定長,只會用一個字符去存儲,還有一個字節用來記錄長度.
## text
文本類型 : 本質上mysql提供了兩種文本類型.
1. text : 存儲普通的字符文本.
2. blob : 存儲二進制文本(圖片,文件) ,一般都不會使用blob來存儲文件本身,通常是使用一個鏈接來指向對應的文件本身,這樣就可以節省可多的空間.
### 系統中提供了四種text
1. tinytext : 系統使用一個字節來保存,系統是用1個字節來保存數據所在的位置,并不是真的用1個字節來保存數據,實際能夠存儲的數據為: 2^8 +1 ;
2. text :使用兩個字節來存儲,實際存儲2^16 +2 .
3. mediumtext : 使用三個字節存儲,實際存儲為 : 2^ 24 +3 .
4. longtext : 使用四個字節存儲 , 實際存儲為 :2 ^ 32 +4.
注意 :
1. 在選擇對應的存儲文本的時候,不用顆粒去選擇text類型,系統會自動根據存儲的數據長度來選擇合適的文本類型.一般使用text類型就行了.
2. 在選擇字符存儲的時候,如果數據超過255個字符,那么一定要選擇text存儲(效率更高,而且更節省空間).
3.
#### enum (枚舉類型)
枚舉類型: 在數據插入之前,先設定幾個項,這幾個項就是可能最終出現的數據結果.
如果確定某個字段的數據只有那么幾個值 :如性別,男,女,保密,系統就可以在設定字段的時候規定當前字段只能存在固定的幾個值,那么請使用枚舉類型.
系統提供了1到2個字節來存儲枚舉數據 : 通過計算enum列舉的具體值來選擇實際的存儲空間,如果數據值列表在255以內,name1個字節就夠了,如果超過255但是小于65535,那么系統采用兩個字節來保存.
語法
~~~
create table class(
gender enum('男','女','保密'));
~~~
注意:
1. 只有插入enum設定的這幾個值才能插入成功,否則的話系統會報錯.
2. 枚舉enum的存儲原理:實際上字段上所存儲的值并不是真正的字符串,而是字符串對應的下標:當系統設定枚舉類型的時候,會給枚舉中每個元素定義一個下標,這個下標規則從1開始Enum(1=>‘男’,2=>’女’,3=>’保密’).
3. 特性:在mysql中系統是自動進行類型轉換的:如果數據碰到“+、-、*、/”系統就會自動將數據轉換成數值:而普通字符串轉換成數值為0 .Select 字段名 + 0 from 表名.
4. 既然實際enum字段存儲的結果是數值:那么在進行數據插入的時候,就可以使用對應的數值來進行.
~~~
select gender + 0 from 表名;
結果: 系統進行了強制轉換.
+------------+
| gender + 0 |
+------------+
| 1 |
| 1 |
+------------+
~~~
枚舉類型的意義 :
1. 規范數據本身,限定只能插入規定的數據項.
2. 節省存儲空間.
#### set (集合類型)
集合:是一種將多個數據選項可以同時保存的數據類型,本質是將指定的項按照對應的二進制位來進行控制:1表示該選項被選中,0表示該選項沒有被選中。
語法
~~~
create table class(
hobby set('足球','籃球','排球','游泳','乒乓球')
);
~~~
插入數據 : 注意在最外層加上引號,里面每個數據用逗號隔開, 不在set設置的數據無法插入,這個類型類似html中的多選.
~~~
insert into class values("足球,籃球,游泳");
~~~
- 數據庫介紹
- 數據庫基本概念
- SQL介紹
- MySQL服務端架構
- 庫操作
- 表操作
- 字段類型
- 整數類型
- 小數類型
- 字符串類型
- 日期/時間類型
- json類型
- 字段屬性
- Null
- 默認值
- 列描述
- 主鍵
- 自動增長
- 唯一鍵
- 數據庫基礎操作
- 增
- 刪
- 改
- 查
- 運算符
- 算術運算符
- 比較運算符
- 邏輯運算符
- in運算符
- is運算符
- like運算符
- 高級查詢
- 聯合查詢
- 連接查詢
- 交叉連接
- 內連接
- 外連接
- Using關鍵字
- 子查詢
- 標量子查詢
- 列子查詢
- 行子查詢
- 表子查詢
- exists子查詢
- 子查詢特定關鍵字
- 用戶權限管理
- 用戶管理
- 權限管理
- 外鍵
- 外鍵操作
- 外鍵基本要求
- 約束
- 視圖
- 事務安全
- 自動事務
- 手動事務
- 事務特點
- 變量
- 系統變量
- 會話變量
- 局部變量
- 流程結構
- if分支
- while循環
- 函數
- 內置函數
- 字符串函數
- 時間函數
- 數學函數
- 其他函數
- 存儲過程
- 與函數的區別
- 存儲過程操作
- 存儲過程的形參類型
- 觸發器
- 觸發器概念
- 觸發器操作