MySQL最佳入門 - MySQL數據類型之字符串類型以及TEXT類型

本篇文章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 佔用空間最少,但是要注意它的特性;
  • 根據性能,空間的佔用,和具體的需要來選擇類型。

總結

  • 定義數據類型就是在定義列,數據類型決定數據的特性;
  • 數據類型主要分爲字符串類型,整數類型,浮點和定點類型,日期類型以及二進制類型;
  • 根據類型在不同的存儲引擎上表現和處理都不同;
  • 根據所採用的數據類型,需求和數據特點選擇數據類型。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章