1. 程式人生 > >例題SQL語句詳解-資料庫基本操作6-資料型別拓展

例題SQL語句詳解-資料庫基本操作6-資料型別拓展

1.3 資料型別——列舉(enum)

1、從集合中選擇一個數據(單選)

mysql> create table t8(
    -> name varchar(20),
    -> sex enum('男','女','保密')   # 列舉
    -> )charset=utf8;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t8 values ('tom','男');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t8 values ('berry'
,'女'); Query OK, 1 row affected (0.05 sec) mysql> insert into t8 values ('rose','未知'); # 報錯,只能插入列舉值 ERROR 1265 (01000): Data truncated for column 'sex' at row 1 mysql> select * from t8; +-------+------+ | name | sex | +-------+------+ | tom | 男 | | berry | 女 | +-------+------+

2、MySQL的列舉型別是通過整數來管理的,第一個值是1,第二個值是2,以此類推。 這裡寫圖片描述

mysql> select sex+0 from t8;
+-------+
| sex+0 |
+-------+
|     1 |
|     2 |
+-------+
mysql> select sex+0 from t8;
+-------+
| sex+0 |
+-------+
|     1 |
|     2 |
+-------+

3、既然列舉在資料庫內部儲存的是整數,那麼可以直接插入數字

mysql> insert into t8 values ('rose',3);  # 可以直接插入數字
Query OK, 1 row affected (0.00 sec)

mysql> select * from t8;
+-------+------+
| name | sex | +-------+------+ | tom | 男 | | berry | 女 | | rose | 保密 | +-------+------+ 3 rows in set (0.00 sec)

列舉的優點:

1、 執行速度快(數字比字串運算速度快)

2、 限制資料,保證資料完整性

3、 節省空間

思考:已知列舉佔用2個位元組,請問最多有多少個列舉值?

答:2個位元組=16位,可以儲存數字(0-65535),列舉是從1開始,所以列舉最多可以有65535個列舉值。

1.4 資料型別——集合(set)

從集合中選擇一些資料(多選)

mysql> create table t9(
    -> hobby set('爬山','讀書','游泳','敲程式碼')
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql> insert into t9 values ('爬山');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values ('爬山,游泳');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values ('游泳,爬山');  # 插入順序不一樣,但是顯示的順序是一樣的
Query OK, 1 row affected (0.02 sec)

mysql> insert into t9 values ('爬山,游泳,開車');  # 報錯,插入集合中沒有的選項會報錯
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1

每個集合的元素都分配一個固定的數字,分配的方式從左往右按2的0、1、2、…次方 這裡寫圖片描述

思考:已知集合佔用8個位元組,最多可以表示幾個選項?

答:8個位元組=64位,一個位表示1個選項,最多可以表示64個選項。

1.5 資料型別——日期型別

資料型別 描述
datetime 日期時間,佔用8個位元組
date 日期 佔用3個位元組
time 時間 佔用3個位元組
timestamp 時間戳,佔用4個位元組
year 年份 佔用1個位元組

1、datetime 格式:年-月-日 小時:分鐘:秒

mysql> create table t10(
    -> field datetime
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t10 values ('2025-10-12 10:12:36');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t10 values ('100-10-12 10:12:36');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t10 values ('10000-10-12 10:12:36');  #datetime儲存範圍是:1~9999年
ERROR 1292 (22007): Incorrect datetime value: '10000-10-12 10:12:36' for column 'field' at row 1

mysql> select * from t10;
+---------------------+
| field               |
+---------------------+
| 2025-10-12 10:12:36 |
| 0100-10-12 10:12:36 |
+---------------------+
2 rows in set (0.00 sec)

2、date 日期格式

mysql> create table t11(
    -> field date
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values ('2025-10-12');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t11;
+------------+
| field      |
+------------+
| 2025-10-12 |
+------------+

3、timestamp:時間戳

timestamp型別和 datetime型別在表現上是一樣的。他們的區別: datetime是從1到9999,而timestamp從1970年~2038年,2038年01月19日11:14:07秒以後就超出timestamp範圍了。

mysql> create table t12(
    -> field timestamp
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t12 values ('1975-5-5 12:12:12');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t12 values ('1969-5-5 12:12:12');   # 超出範圍
ERROR 1292 (22007): Incorrect datetime value: '1969-5-5 12:12:12' for column 'field' at row 1
mysql> insert into t12 values ('2038-1-19 11:14:07');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t12 values ('2038-1-19 11:14:08');  # 超出範圍
ERROR 1292 (22007): Incorrect datetime value: '2038-1-19 11:14:08' for column 'field' at row 1

mysql> select * from t12;
+---------------------+
| field               |
+---------------------+
| 1975-05-05 12:12:12 |
| 2038-01-19 11:14:07 |
+---------------------+

4、year

因為只佔用1個位元組,最多隻能表示255個年份,範圍是1901-2155之間的年份

mysql> create table t13(
    -> field year
    -> );
Query OK, 0 rows affected (0.06 sec)

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

mysql> insert into t13 values (1900);   # 超出範圍
ERROR 1264 (22003): Out of range value for column 'field' at row 1
mysql> insert into t13 values (2155);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t13 values (2156);   # 超出範圍
ERROR 1264 (22003): Out of range value for column 'field' at row 1

5、time 表示時間或時間間隔,範圍是-838:59:59~838:59:59

mysql> create table t14(
    -> field time
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t14 values ('12:12:12');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t14 values ('212:12:12');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t14 values ('838:59:59');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t14 values ('839:00:00');  # 操作範圍
ERROR 1292 (22007): Incorrect time value: '839:00:00' for column 'field' at row 1
mysql>

多學一招:time支援以天的方式插入

mysql> insert into t14 values ('10 10:10:10');
Query OK, 1 row affected (0.02 sec)

mysql> select * from t14;
+-----------+
| field     |
+-----------+
| 12:12:12  |
| 212:12:12 |
| 838:59:59 |
| 250:10:10 |
+-----------+