# 數據類型
[TOC]
## 列屬性
| 名稱 | 描述|
| --- | --- |
| auto_increment | 自增數 |
| default | 默認值 |
| not null | 不為空 |
| zerofill | 填充零 |
## 整數類型
| 名稱 | 大小 | 范圍 | 范圍(無符號)|
| --- | --- | --- | --- |
| tiny INT | 1個字節 | -128, 127 | 0, 255|
| small INT | 2個字節 | -32768, 32767 | 0, 65535|
| medium INT | 3個字節 | -8388608, 8388607 | 0, 16777215|
| INT |INT eger | 4個字節 | -2147483648, 2147483647 | 0, 4294967295|
| big INT | 8個字節 | 超大整數 | |
* int(0) : 顯示數字的寬度,不限制值的大小
* 以上可配合 unsigned (無符號) 非負數, zerofill :0填充
*****
## 實數類型 - 浮點
| 名稱 | 大小 | 類型| 范圍|
| --- | --- | --- | --- |
| float | 4個字節 | 單精度 | 255, 30|
| double | 8個字節 | 雙精度 | 255, 30|
| decimal | | 定點型 | 65, 30|
* float數值類型用于表示單精度浮點數值
* double數值類型用于表示雙精度浮點數值
* float和double都是浮點型,而decimal是定點型;
`
單精度浮點數用4字節(32bit)表示浮點數,格式是:1位符號位 8位表示指數 23位表示尾數
`
`
雙精度浮點數8字節(64bit)表示實數,格式是:1位符號位 11位表示指數 52位表示尾數
`
> 7.22 轉成 二進制 111.00111000010100011110101110000101000111101011100001
> 可發現無論是單精度還是雙精度浮點數表示都會產生誤差,只是程度不同
> 因此在計算時特別注意浮點數
> deicmal 可以存儲比bigint還大的整數,也可存儲精確的小數
**decimal**
```
MySQL分別為整數和小數部分分配存儲空間。 MySQL使用二進制格式存儲`DECIMAL`值。它將`9`位數字包裝成`4`個字節。
對于每個部分,需要`4`個字節來存儲`9`位數的每個倍數。剩余數字所需的存儲如下表所示:
| 剩余數字 | 位 |
| --- | --- |
| 0 | 0 |
| 1–2 | 1 |
| 3–4 | 2 |
| 5–6 | 3 |
| 7-9 | 4 |
例如,`DECIMAL(19,9)`對于小數部分具有`9`位數字,對于整數部分具有`19`位=?`10`位數字,小數部分需要`4`個字節。 整數部分對于前`9`位數字需要`4`個字節,`1`個剩余字節需要`1`個字節。`DECIMAL(19,9)`列總共需要`9`個字節。
```
****
## 字符串類型
| 名稱 | 大小 | 描述及存儲需求 |
| --- | --- | --- |
| varchar | M | M為0~65536之間的整數|
| char | M | M為0~255之間的整數|
| tiny text | | 允許長度0~255字節|
| text | | 允許長度0~65535字節|
| tiny blob | | 允許長度0~255字節|
| blob | | 允許長度0~65535字節|
> varchar 用于存儲可變長字符串,它比定長類型更節省空間,varchar使用1或2個額外字節記錄字符串長度,列長度小于255字節,使用1個字節表示,否則用2個
> char 是定長的,根據定義的字符串長度分配足夠的空間,會根據需要采用`空格`進行填充以方便比較, char 適合存儲很短的字符串,或者所有值都接近同一個長度
>* varchar(n) 和 char(n) 可以存儲的中文字符數和英文字符數是一致的,都是n個字符
>* 4.x版本是通過字節數表示,5.x版本是表示字符數
* char 和 varchar 存儲超過設定的長度時 都會被截斷
* 對于非常短的列,char比varchar在存儲空間上更有效率
* 在檢索的時候,char列會刪除尾部的空格而varchar則保留了這些空格
> text 以字符串存儲,blob 以二進制存儲。
****
## 枚舉類型
| 名稱 | 大小 | 描述及存儲需求 |
| --- | --- | --- |
| enum | 2個字節 | 內部存儲整數|
* 共有2 個字節,0-65535,因此可以有 65535個選項可以使用
* 可插入常量相等的索引數值: 從1開始
> 不使用數字作為enum枚舉的常量,易混亂
> 排序是按照內部存儲的整數進行排序
****
## 時間類型
| 名稱 | 大小 | 格式 |
| --- | --- | --- |
| datetime | 8個字節 | YYYY-MM-DD HH:MM:SS |
| timestamp | 4個字節 | YYYY-MM-DD HH:MM:SS|
| date | 4個字節 | ?YYYY-MM-DD|
| time | 3個字節 | HH:MM:SS|
| year | 1個字節 | YYYY|
* datetime 是原樣輸入輸出,timestamp 是把客戶端插入的時間從當前時區轉化為UTC(世界標準時間)進行存儲。查詢時,將其又轉化為客戶端當前時區進行返回。
* timestamp 最大范圍是到2038年某個時刻
> timestamp 比datetime 效率更高
> `CURRENT_TIMESTAMP`表示使用`CURRENT_TIMESTAMP()`函數來獲取當前時間,類似于NOW()函數
> 用整數保存時間戳的格式不方便處理
> 存儲微秒,可以使用bigint存儲
- 簡介
- PHP
- 字符串函數
- 數組函數
- 正則
- 加密函數
- 面向對象
- 關鍵字
- 設計模式
- 魔術方法
- 機制擴展
- 會話機制
- PHP框架
- laravel
- 問題
- swoole
- easyswoole
- workerman
- 數據庫
- Sphinx
- MongoDB
- MemCache
- Redis
- 基礎操作
- 數據類型
- 持久化
- 分布式鎖
- 內存模型
- redis高級特性
- MySql
- 基礎操作
- 數據類型
- 數據表引擎
- 鎖機制
- 事務處理
- 存儲過程
- 觸發器
- 索引
- 關聯查詢
- 分析SQL語句-優化查詢
- 分區分表
- 主從復制
- MySql安全性
- 網絡協議
- HTTP
- header詳解
- 狀態碼
- nginx-配置
- 邏輯算法
- 時間和空間復雜度
- 常見算法
- 數據結構
- 核心
- 進程、線程、協程
- 存儲容量-計量單位
- 開發軟件及配置
- 版本控制器
- Git
- Fidder
- Fidder-Android7
- 自動化部署
- Jenkins
- supervisor
- Elasticsearch
- LogStash
- RabbitMQ
- AB測試
- JAVA-JDK
- FileBeat
- PhpStorm
- Composer
- Linux
- API安全
- 高并發及大流量相關概念
- 網站優化
- WEB
- Electron