1. 程式人生 > 資料庫 >mysql基礎(10)_列型別之字串型【二】_text、enum

mysql基礎(10)_列型別之字串型【二】_text、enum

Text

文字型別:本質上mysql提供了兩種文字型別
Text:儲存普通的字元文字,英文儲存區分大小寫
Blob:儲存二進位制文字(圖片,檔案),英文儲存不區分大小寫,一般都不會使用blob來儲存檔案本身,通常是使用一個連結來指向對應的檔案本身。

系統中提供的四種text:(L代表字元數)
Tinytext:系統使用一個位元組來儲存資料所在的位置,實際能夠儲存的資料長度為:L + 1 bytes, where L < 2^8
Text:使用兩個位元組儲存,實際儲存為: L + 2 bytes, where L < 2^16
Mediumtext:使用三個位元組儲存,實際儲存為:L + 3 bytes, where L < 2^24

Longtext:使用四個位元組儲存,實際儲存為:  L + 4 bytes, where L < 2^32

注意:
1、在選擇對應的儲存文字的時候,不用刻意去選擇text型別,系統會自動根據儲存的資料長度來選擇合適的文字型別。
2、在選擇字元儲存的時候,如果資料超過255個字元,那麼一定選擇text儲存。(此時不需要用varchar(L),效率不如text,更能節省空間)

Enum

列舉型別:在資料插入之前先設定幾個項,這幾個項就是可能最終出現的資料結果。

什麼時候使用列舉?
如果確定某個欄位的資料只有那麼幾個值:如性別,男、女、保密,系統就可以在設定欄位的時候規定當前欄位只能存放固定的幾個值

基本語法:enum(資料值1,資料值2...)

儲存:系統提供了1到2個位元組來儲存列舉資料,通過計算enum列舉的具體值來選擇實際的儲存空間(如果資料值列表在255個以內,那麼一個位元組就夠,如果超過255但是小於65535,那麼系統採用兩個位元組儲存。)

列舉文字的索引值
ENUM 型別中的任何一個列舉值都有一個內部的數字索引:所以在建立表結構時指定的列舉值都會分配一個內部索引,索引的下標從 1 開始。

注意:下標並不是從0開始。如果插入設定值外的其它字元,則視為空字串,空字串作為錯誤值的索引值為0,正因如此,我們可以使用select語句來查詢那些插入的或更新的無效的列舉值SELECT * FROM tbl_name WHERE enum_column=0;另外NULL的索引為NULL,刪除欄位值為null的條件寫成where fieldname=null是錯誤的,正確的寫法應該是:delete from tablename where fieldname is null。

列舉enum的儲存原理分析:在mysql中系統是自動進行型別轉換的,如果資料碰到"+、-、*、/"系統就會自動將資料轉換成數值,而普通字串轉換成數值為0。實際上欄位上所儲存的值並不是真正的字串,而是字串對應的下標,當系統設定列舉型別的時候,會給列舉中每個元素定義一個下標,這個下標規則從1開始。

Enum(1=>'男',2=>'女',3=>'保密') 相當於陣列,可通過 Select 欄位名 +0 from 表名; 查詢下標,既然實際enum欄位儲存的結果是數值,那麼在進行資料插入的時候,就可以使用對應的數值來進行。經實驗,列舉列表內容更新或刪除時需要慎重,如圖,具體原因目前尚未找到。

mysql> create table chartype_enum(
    -> gender enum('男','女','保密','null')
    -> )charset=utf8;
Query OK, 0 rows affected (1.76 sec)

mysql> insert into chartype_enum values('男');
Query OK, 1 row affected (0.00 sec)
mysql> insert into chartype_enum values('保密');
Query OK, 1 row affected (0.00 sec)
mysql> insert into chartype_enum values('女');
Query OK, 1 row affected (0.00 sec)
mysql> insert into chartype_enum values('remale');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into chartype_enum values('null');
Query OK, 1 row affected (0.00 sec)

mysql> select * from chartype_enum;
+--------+
| gender |
+--------+
| 男     |
| 保密   |
| 女     |
|        |
| null   |
+--------+
5 rows in set (0.00 sec)

mysql> select gender +0 from chartype_enum;
+-----------+
| gender +0 |
+-----------+
|         1 |
|         3 |
|         2 |
|         0 |
|         4 |
+-----------+
5 rows in set (0.00 sec)

mysql> alter table chartype_enum modify gender enum('男','女','保密');
Query OK, 5 rows affected, 1 warning (1.78 sec)
Records: 5  Duplicates: 0  Warnings: 1

mysql> select gender +0 from chartype_enum;
+-----------+
| gender +0 |
+-----------+
|         1 |
|         3 |
|         2 |
|         0 |
|         0 |
+-----------+
5 rows in set (0.00 sec)

mysql> delete from chartype_enum where gender=0;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from chartype_enum;
+--------+
| gender |
+--------+
| 男     |
| 保密   |
| 女     |
+--------+
3 rows in set (0.00 sec)

-- 為什麼插入數值出現錯誤呢?此處懷疑是刪除列舉列表值時下標索引沒有更新,因此建議列舉列表更改需要慎重!!!
mysql> insert into chartype_enum values(2);
Query OK, 1 row affected (0.00 sec)

mysql> insert into chartype_enum values(3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from chartype_enum;
+--------+
| gender |
+--------+
| 男     |
| 保密   |
| 女     |
| 保密   |
| 女     |
+--------+
5 rows in set (0.00 sec)

-- 此處以及之後又正常插入了,奇了怪了
mysql> insert into chartype_enum values(3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from chartype_enum;
+--------+
| gender |
+--------+
| 男     |
| 保密   |
| 女     |
| 保密   |
| 女     |
| 保密   |
+--------+
6 rows in set (0.00 sec)

列舉的意義:
1、規範資料本身,限定只能插入規定的資料項
2、節省儲存空間