例題SQL語句詳解-資料庫基本操作6-資料型別拓展
阿新 • • 發佈:2018-12-10
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 |
+-----------+