本篇文章MySQL版本:
+-----------+
| version() |
+-----------+
| 5.5.53 |
+-----------+
字符串類型
- 字符串類型是一個統稱,包含多種不同的數據類型;
- 分爲文本字符串類型和二進制字符串類型;
- 不僅可以存儲字符串,還可以存儲其他類型;
- 字符串可以區分或不區分大小寫的串比較;
- 支持進行模式匹配查找;
CHAR(M)
定長字符串,M,定義字符串的長度,最大值255;定長指定長度之後不變,M就爲佔用字符;
VARCHAE(M)
可變字符串,字符長度多少,佔用多少字符;
創建表
mysql> create table t_char( col1 char(4), col2 varchar(4));
Query OK, 0 rows affected (0.01 sec)
mysql> desc t_char;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| col1 | char(4) | YES | | NULL | |
| col2 | varchar(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
正常操作
插入兩條數據,同樣的數據:
mysql> insert into t_char values('ab ','ab ');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from t_char;
+------+------+
| col1 | col2 |
+------+------+
| ab | ab |
+------+------+
1 row in set (0.00 sec)
連接字符串(合併)
mysql> select concat(col1,'!'),concat(col2,'!') from t_char;
+------------------+------------------+
| concat(col1,'!') | concat(col2,'!') |
+------------------+------------------+
| ab! | ab ! |
+------------------+------------------+
1 row in set (0.00 sec)
char 已經有ab然後空格佔位,加入感嘆號,則去掉佔位空格。
顯示長度
mysql> insert into t_char values('abcd','abcd');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t_char;
+------+------+
| col1 | col2 |
+------+------+
| ab | ab |
| abcd | abcd |
+------+------+
2 rows in set (0.00 sec)
大於存儲長度
mysql> insert into t_char values('abcdef','abcdef');
Query OK, 1 row affected, 2 warnings (0.01 sec)
mysql> select * from t_char;
+------+------+
| col1 | col2 |
+------+------+
| ab | ab |
| abcd | abcd |
| abcd | abcd |
+------+------+
3 rows in set (0.00 sec)
sql_mode
mysql> show variables like 'sql_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode | |
+---------------+-------+
1 row in set (0.00 sec)
大於 指定長度可以插入數據是因爲 sql_mode value爲空,決定的。5.5之後會被設置爲 嚴格模式。
TEXT類型
- Text類型及其子類型用於存儲比較長的非二進制字符串,比如:文章,評論等。
- Text可以認爲是VARCHAR類型的加長增強版;
- Text類型不區分大小寫。
創建表插入兩條數據
mysql> create table t_text( col1 text );
Query OK, 0 rows affected (0.01 sec)
mysql> desc t_text;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1 | text | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.01 sec)
mysql> insert into t_text values ('full-stack'),('VX');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t_text;
+------------+
| col1 |
+------------+
| full-stack |
| VX |
+------------+
2 rows in set (0.00 sec)
模糊查詢 %
mysql> select * from t_text where col1 like '%fu%';
+------------+
| col1 |
+------------+
| full-stack |
+------------+
1 row in set (0.00 sec)
ENUM類型
- ENUM類型存儲的數據好比是單項選擇題裏的選項,其存儲的值爲表創建時在列規定中枚舉的一列值;
- 比如 男 女,性別字段,可以加UM,但是不能有其他數值;
普通操作
mysql> create table t_enum(
-> id int ,
-> name varchar(10),
-> sex enum('F','M','UM')
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc t_enum;
+-------+--------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| sex | enum('F','M','UM') | YES | | NULL | |
+-------+--------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
插入數據
mysql> insert into t_enum values (1,'soinice','F');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_enum;
+------+---------+------+
| id | name | sex |
+------+---------+------+
| 1 | soinice | F |
+------+---------+------+
1 row in set (0.00 sec)
不可插入空值,也不可插入 非 F M UN字符。
SET類型
- Set類型存儲的數據好比是多項選擇題裏的選項,其存儲的值爲表創建時規定的一列值;
創建表
mysql> create table t_set( col1 set('a','b','c') );
Query OK, 0 rows affected (0.01 sec)
mysql> desc t_set
-> ;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| col1 | set('a','b','c') | YES | | NULL | |
+-------+------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
插入數據
mysql> insert into t_set values ('a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_set values ('ab');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into t_set values ('a,b');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_set values ('a,b,c');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_set;
+-------+
| col1 |
+-------+
| a |
| |
| a,b |
| a,b,c |
+-------+
4 rows in set (0.00 sec)
只能插入指定好的值,非指定在內的值是插不進去的。
二進制類型
- 二進制類型及其子類型是用於存儲二進制數據的類型;
- no character set;
- 以bytes 爲單位存儲,以bytes爲單位比較。
選擇合適的數據類型
字符串類型的選擇
不同數據引擎,選項不同
MYISAM:
是一種非常適合讀多寫少,當讀CHAR定長會比VARCHAR效率高,因爲是定長的,效率會高;
Innodb:
相率方面,CHAR和VARCHAR效率相差不大,但是VARCHAR佔用內存相對會比較好,根據具體長度來消耗存儲空間;
MEMORY:
存放在內存中的數據引擎,VARCHAR更適合,因爲會節省內存。讀取效率差異,CHAR和VARCHAR幾乎可以忽略,因爲內存的IO效率,肯定比硬盤IO高。
不同用途,選擇不同
CHAR:很短的字符,經常變更的內容;
VARCHAR:與上條相反。
浮點數和定點數的選擇
- 精度要求不同,選擇大不同;
- 相比較而言,定點數的計算代價要昂貴的多,一般用在和錢有關的地方;
大數據類型的選擇
- 能不用盡量不用,TEXT和BLOG有很多替代選擇,比如 靜態化成一個個靜態文件,通過數據記錄文件位置,通過位置獲取文件內容;
- 如果存在經常的刪除和更新,建議定期使用optimize table 進行碎片整理;
- 電影可以用二進制進行存儲,但是效率非常差,比如,從數據庫取出二進制,然後組裝成文件,再返回。
日期類型的選擇
- TIMESTAMP 佔用空間最少,但是要注意它的特性;
- 根據性能,空間的佔用,和具體的需要來選擇類型。
總結
- 定義數據類型就是在定義列,數據類型決定數據的特性;
- 數據類型主要分爲字符串類型,整數類型,浮點和定點類型,日期類型以及二進制類型;
- 根據類型在不同的存儲引擎上表現和處理都不同;
- 根據所採用的數據類型,需求和數據特點選擇數據類型。