MySQL數(shù)據(jù)庫的數(shù)據(jù)類型和基于MySQL數(shù)據(jù)類型的綜合實例項目
1、MySQL具有的數(shù)據(jù)類型
1.1、MySQL整數(shù)類型
數(shù)值型數(shù)據(jù)類型主要用來存儲數(shù)字。MySQL的整數(shù)類型如下所示
TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、 BIGINT。
類型名稱 | 說明 | 存儲需求 |
---|---|---|
TINYINT | 很小的整數(shù) | 1字節(jié) |
SMALLINT | 小的整數(shù) | 2字節(jié) |
MEDIUMINT | 中等大小的整數(shù) | 3字節(jié) |
INT | 普通大小的整數(shù) | 4字節(jié) |
BIGINT | 大整數(shù) | 8字節(jié) |
創(chuàng)建表tmp1,其中字段x、y、z、m、n數(shù)據(jù)類型依次為TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,SQL語句如下:
mysql> CREATE TABLE tmp1 ( x TINYINT, y SMALLINT, z MEDIUMINT, m INT, n BIGINT );
Query OK, 0 rows affected (0.01 sec)
mysql> DESC tmp1;
+-------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| x | tinyint | YES | | NULL | |
| y | smallint | YES | | NULL | |
| z | mediumint | YES | | NULL | |
| m | int | YES | | NULL | |
| n | bigint | YES | | NULL | |
+-------+-----------+------+-----+---------+-------+
5 rows in set (0.00 sec)
1.2、MySQL浮點類型和定點數(shù)
MySQL中使用浮點數(shù)和定點數(shù)來表示小數(shù)。
浮點類型:FLOAT、DOUBLE。
定點類型:DECIMAL。
類型名稱 | 說明 | 存儲需求 |
---|---|---|
FLOAT | 單精度浮點數(shù) | 4字節(jié) |
DOUBLE | 雙精度浮點數(shù) | 8字節(jié) |
DECIMAL(M,D) | 定點數(shù) | M+2字節(jié) |
DECIMAL的存儲空間不是固定的,而是由M和D決定的。
創(chuàng)建表tmp2,其中字段x、y、z數(shù)據(jù)類型依次為FLOAT(5,1)、DOUBLE(5,1)和DECIMAL(5,1),向表中插入數(shù)據(jù)5.12、5.15和5.123,SQL語句如下:
mysql> CREATE TABLE tmp2 ( x FLOAT(5,1), y DOUBLE(5,1), z DECIMAL(5,1) );
Query OK, 0 rows affected, 2 warnings (0.01 sec)
向tmp2表中插入數(shù)據(jù):
mysql> INSERT INTO tmp2 VALUES(5.12, 5.15, 5.123);
Query OK, 1 row affected, 1 warning (0.01 sec)
查看警告信息
mysql> SHOW WARNINGS;
+-------+------+----------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------+
| Note | 1265 | Data truncated for column 'z' at row 1 |
+-------+------+----------------------------------------+
1 row in set (0.00 sec)
可以看到定點數(shù)被階段了,發(fā)出警告
查看如下:
mysql> SELECT * FROM tmp2;
+------+------+------+
| x | y | z |
+------+------+------+
| 5.1 | 5.2 | 5.1 |
+------+------+------+
1 row in set (0.00 sec)
1.3、MySQL日期與時間類型
MySQL中表示日期和時間的數(shù)據(jù)類型有
YEAR、TIME 、DATE、DATETIME和TIMESTAMP。
類型名稱 | 日期格式 | 日期范圍 | 存儲需求 |
---|---|---|---|
YEAR | YYYY | 1901~2155 | 1字節(jié) |
TIME | HH:MM:SS | -838:59:59~838:59:59 | 3字節(jié) |
DATE | YYYY-MM-DD | 1000-01-01~9999-12-3 | 3字節(jié) |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 8字節(jié) |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:1 UTC~2038-01-19 03:14:07 UTC | 4字節(jié) |
1、YEAR
存儲格式:
存儲方式(YEAR) 范圍 注意點
4位字符串或數(shù)字 ‘1901’~’2155’ 輸入‘2022’或2022,插入到數(shù)據(jù)庫的值都為2022
2位字符串 ‘00’~’99’ ‘00’~‘69’對應2000~2069;‘70’~‘99’對應1970~1999;
2位數(shù)字 1~99 1~69對應2001~2069;70~99對應1970~1999;0對應0000
創(chuàng)建數(shù)據(jù)表tmp3,定義數(shù)據(jù)類型為YEAR的字段y,向表中插入值2010,’2010’,’2166’,SQL語句如下:
首先創(chuàng)建表tmp3:
mysql> CREATE TABLE tmp3( y YEAR );
Query OK, 0 rows affected (0.01 sec)
向表中插入數(shù)據(jù):
mysql> INSERT INTO tmp3 values(2010),('2010');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
再次向表中插入數(shù)據(jù):
mysql> INSERT INTO tmp3 values ('2166');
ERROR 1264 (22003): Out of range value for column 'y' at row 1
mysql> SHOW WARNINGS;
+-------+------+--------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------+
| Error | 1264 | Out of range value for column 'y' at row 1 |
+-------+------+--------------------------------------------+
1 row in set (0.00 sec)SELECT * FROM tmp3;
2166超過了最大取值:2155,所以會有Out of range value for column ‘y’ at row 1的錯誤。
查看數(shù)據(jù)表tmp3中的數(shù)據(jù)表
mysql> SELECT * FROM tmp3;
+------+
| y |
+------+
| 2010 |
| 2010 |
+------+
2 rows in set (0.00 sec)
可以看到2010和‘2010’都轉換成了2010。
向tmp3表中y字段插入2位字符串表示的YEAR值,分別為’0’、’00’、’77’和’10’,SQL語句如下:
向表中插入數(shù)據(jù):
mysql> INSERT INTO tmp3 values('0'),('00'),('77'),('10');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
查看數(shù)據(jù)表tmp3中的數(shù)據(jù)表:
mysql> SELECT * FROM tmp3;
+------+
| y |
+------+
| 2010 |
| 2010 |
| 2000 |
| 2000 |
| 1977 |
| 2010 |
+------+
6 rows in set (0.00 sec)
可以看到‘0’,‘00’轉換成了2000,‘77’轉換成了1977,‘10’轉換成了2010。
向tmp3表中y字段插入2位數(shù)字表示表示的YEAR值,分別為0、75和13,SQL語句如下:
向表中插入數(shù)據(jù):
mysql> INSERT INTO tmp3 values(0),(75),(13);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
查看數(shù)據(jù)表tmp3中的數(shù)據(jù)表:
SELECT * FROM tmp3;
mysql> SELECT * FROM tmp3;
+------+
| y |
+------+
| 2010 |
| 2010 |
| 2000 |
| 2000 |
| 1977 |
| 2010 |
| 0000 |
| 1975 |
| 2013 |
+------+
9 rows in set (0.00 sec)
可以看到0轉換成了0000,75轉換成了1975,13轉換成了2013。
2、TIME
存儲格式:
存儲方式(TIME) 范圍 注意點
‘HH:MM:SS -838:59:59~838:59:59 ‘HHMMSS’類型的字符串被理解為:‘HH:MM:SS’;’D HH:MM:SS’的D為0~34之間,為小時保存—》‘D*24+H’
創(chuàng)建數(shù)據(jù)表tmp4,定義數(shù)據(jù)類型為TIME的字段t,向表中插入值’10:05:05’,’23:23’,’2 10:10’,’3 02’,’10’,SQL語句如下:
首先創(chuàng)建表tmp4,
mysql> CREATE TABLE tmp4( t TIME );
Query OK, 0 rows affected (0.01 sec)
向表中插入數(shù)據(jù):
INSERT INTO tmp4 values('10:05:05 '), ('23:23'), ('2 10:10'), ('3 02'),('10');
mysql> INSERT INTO tmp4 values('10:05:05 '), ('23:23'), ('2 10:10'), ('3 02'),('10');
Query OK, 5 rows affected, 1 warning (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 1
查看結果:
mysql> SELECT * FROM tmp4;
+----------+
| t |
+----------+
| 10:05:05 |
| 23:23:00 |
| 58:10:00 |
| 74:00:00 |
| 00:00:10 |
+----------+
5 rows in set (0.00 sec)
向表tmp4中插入值’101112’,111213,’0’,107010,SQL語句如下:
向表中插入數(shù)據(jù):
mysql> INSERT INTO tmp4 values('101112'),(111213),( '0');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
再向表中插入數(shù)據(jù):
mysql> INSERT INTO tmp4 values ( 107010);
ERROR 1292 (22007): Incorrect time value: '107010' for column 't' at row 1
mysql> show warnings;
+-------+------+--------------------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------------------+
| Error | 1292 | Incorrect time value: '107010' for column 't' at row 1 |
+-------+------+--------------------------------------------------------+
1 row in set (0.00 sec)
可以看到插入的時間不對會報錯。
3、DATE
DATE類型用在僅需要日期值時,沒有時間部分,在存儲時需要3字節(jié)。日期格式為’YYYY-MM-DD’—》YYYY表示年,MM表示月,DD表示日。在給Date類型的字段賦值時,可以使用字符串類型或者數(shù)字類型的數(shù)據(jù)插入,只要符合DATE的日期格式即可。
(1)、以‘YYYY-MM-DD’或者‘YYYYMMDD’字符串格式表示的日期,取值范圍為“1000-01-01’~ 9999-12-3’。例如,輸入‘2022-08-01’ 或者‘20220801’,期都為2022-08-01。
(2)、以‘YY-MM-DD’ 或者’YYMMDD’’ 字符串格式表示的日期,在這里YY表示兩位的年值。Mysql使用以下規(guī)則解釋兩位年值:‘0069’范圍的年值轉換為‘2000 2069’;‘70~ 99’范圍的年值轉換為‘1970~ 1999’。例如,輸入‘22-08-01’,插入數(shù)據(jù)庫的日期為2022-08-01; 輸入‘991231’,插入數(shù)據(jù)的日期為1999-12-31。
(3)、以YY-MM-DD或者YYMMDD數(shù)字格式表示的日期,與前面相似,0069范圍的年值轉換為2000 2069,70~ 99范圍的年值轉換為1970~1999。例如,輸入12-12-31 插入數(shù)據(jù)庫的日期為2012-12-31;輸入981231,插入數(shù)據(jù)的日期為1998-12-31。
(4)、使用CURRENT DATE或者NOW(),插入當前系統(tǒng)日期。
創(chuàng)建數(shù)據(jù)表tmp5,定義數(shù)據(jù)類型為DATE的字段d,向表中插入“YYYY-MM-DD”和“YYYYMMDD”字符串格式日期,SQL語句如下:
首先創(chuàng)建表tmp5:
mysql> CREATE TABLE tmp5(d DATE);
Query OK, 0 rows affected (0.01 sec)
向表中插入“YYYY-MM-DD”和“YYYYMMDD”格式日期:
mysql> INSERT INTO tmp5 values('2022-08-01'),('19990108'),('20220610');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
查看插入結果:
mysql> SELECT * FROM tmp5;
+------------+
| d |
+------------+
| 2022-08-01 |
| 1999-01-08 |
| 2022-06-10 |
+------------+
3 rows in set (0.00 sec)
向tmp5表中插入“YY-MM-DD”和“YYMMDD”字符串格式日期,SQL語句如下:
向表中插入“YY-MM-DD”和“YYMMDD”格式日期:
mysql> INSERT INTO tmp5 values ('99-09-09'),( '990909'), ('000101') ,('111111');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
查看插入結果:
SELECT * FROM tmp5;
mysql> SELECT * FROM tmp5;
+------------+
| d |
+------------+
| 2022-08-01 |
| 1999-01-08 |
| 2022-06-10 |
| 1999-09-09 |
| 1999-09-09 |
| 2000-01-01 |
| 2011-11-11 |
+------------+
7 rows in set (0.00 sec)
向tmp5表中插入YY-MM-DD和YYMMDD數(shù)字格式日期,SQL語句如下:
向表中插入YY-MM-DD和YYMMDD數(shù)字格式日期:
mysql> INSERT INTO tmp5 values(990909), ( 000101) ,( 111111);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
查看插入結果:
SELECT * FROM tmp5;
mysql> SELECT * FROM tmp5;
+------------+
| d |
+------------+
| 1999-09-09 |
| 2000-01-01 |
| 2011-11-11 |
+------------+
3 rows in set (0.00 sec)
向tmp5表中插入系統(tǒng)當前日期,SQL語句如下:
向表中插入系統(tǒng)當前日期:
mysql> INSERT INTO tmp5 values( CURRENT_DATE() ),( NOW() );
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 1
查看插入結果:
SELECT * FROM tmp5;
mysql> SELECT * FROM tmp5;
+------------+
| d |
+------------+
| 1999-09-09 |
| 2000-01-01 |
| 2011-11-11 |
| 2022-08-05 |
| 2022-08-05 |
+------------+
5 rows in set (0.00 sec)
4、DATETIME
DATETIME類型用于需要同時包含日期和時間信息的值,在存儲時需要8字節(jié)。日期格式為’YYYY-MM-DD HH:MM:SS’。其中,YYYY表示年,MM表示月,DD表示日,HH表示小時,MM表示分鐘,SS表示秒。在給DATETIME類型的字段賦值時,可以使用字符串類型或者數(shù)字類型的數(shù)據(jù)插入,只要符合DATETIME的日期格式即可。
(1)、以’YYYY-MM-DD HH:MM:SS’ 或者’YYYYMMDDHHMMSS’字符串格式表示的值,取值范圍為‘1000-01-0100:00:00’~‘ 9999-12-323:59:59’。例如,輸入‘2019-12-31 05: 05: 05’或者20191231050505’ ,插入數(shù)據(jù)庫的DATETIME值都為2019-12-31 05: 05: 05。
(2)、以’YY-MM-DD HH:MM:SS’ 或者‘YYMMDDHHMMSS’ 字符串格式表示的日期,在這里YY表示兩位的年值。與前面相同,‘00~69’ 范圍的年值轉換為“2000~2069’ ,‘ 7099’范圍的年值轉換為‘19701999’。例如,輸入‘19-12-31 05:05:05’,插入數(shù)據(jù)庫的DATETIME為2019-12-31 05:05:05;輸入‘990505050505’ ,插入數(shù)據(jù)庫的DATETIME為1999-05-05:05:05:
(3)以YYYYMMDDHHMMSS或者YYMMDDHHMMSS數(shù)字格式表示的日期和時間。例如,輸入20191231050505,插入數(shù)據(jù)庫的DATETIME為2019-12-31 05:05:05;輸入991231050505,插入數(shù)據(jù)的DATETIME為1999-12-31 05: 05:05。
創(chuàng)建數(shù)據(jù)表tmp6,定義數(shù)據(jù)類型為DATETIME的字段dt,向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”字符串格式日期和時間值,SQL語句如下:
首先創(chuàng)建表tmp6:
mysql> CREATE TABLE tmp6( dt DATETIME );
Query OK, 0 rows affected (0.01 sec)
向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”格式日期:
mysql> INSERT INTO tmp6 values('1998-08-08 08:08:08'),('19980808080808'),('20101010101010');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
查看插入結果:
mysql> SELECT * FROM tmp6;
+---------------------+
| dt |
+---------------------+
| 1998-08-08 08:08:08 |
| 1998-08-08 08:08:08 |
| 2010-10-10 10:10:10 |
+---------------------+
3 rows in set (0.00 sec)
向tmp6表中插入“YY-MM-DD HH:MM:SS”和“YYMMDDHHMMSS”字符串格式日期和時間值,SQL語句如下:
向表中插入“YY-MM-DD HH:MM:SS”和“YYMMDDHHMMSS”格式日期:
mysql> INSERT INTO tmp6 values('98-12-09 09:09:09'),('981209090909'),('121010101010');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
查看插入結果:
mysql> SELECT * FROM tmp6;
+---------------------+
| dt |
+---------------------+
| 1998-08-08 08:08:08 |
| 1998-08-08 08:08:08 |
| 2010-10-10 10:10:10 |
| 1998-12-09 09:09:09 |
| 1998-12-09 09:09:09 |
| 2012-10-10 10:10:10 |
+---------------------+
6 rows in set (0.00 sec)
向tmp6表中插入YYYYMMDDHHMMSS 和YYMMDDHHMMSS數(shù)字格式日期和時間值,SQL語句如下:
向表中插入YYYYMMDDHHMMSS和YYMMDDHHMMSS數(shù)字格式日期和時間:
mysql> INSERT INTO tmp6 values(19951008060606), (101016105030);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
查看插入結果:
SELECT * FROM tmp6;
mysql> SELECT * FROM tmp6;
+---------------------+
| dt |
+---------------------+
| 1998-08-08 08:08:08 |
| 1998-08-08 08:08:08 |
| 2010-10-10 10:10:10 |
| 1998-12-09 09:09:09 |
| 1998-12-09 09:09:09 |
| 2012-10-10 10:10:10 |
| 1995-10-08 06:06:06 |
| 2010-10-16 10:50:30 |
+---------------------+
8 rows in set (0.00 sec)
向tmp6表中插入系統(tǒng)當前日期和時間值,SQL語句如下:
向表中插入系統(tǒng)當前日期:
mysql> INSERT INTO tmp6 values( NOW() );
Query OK, 1 row affected (0.01 sec)
查看插入結果:
SELECT * FROM tmp6;
mysql> SELECT * FROM tmp6;
+---------------------+
| dt |
+---------------------+
| 1998-08-08 08:08:08 |
| 1998-08-08 08:08:08 |
| 2010-10-10 10:10:10 |
| 1998-12-09 09:09:09 |
| 1998-12-09 09:09:09 |
| 2012-10-10 10:10:10 |
| 1995-10-08 06:06:06 |
| 2010-10-16 10:50:30 |
| 2022-08-05 15:15:39 |
+---------------------+
9 rows in set (0.00 sec)
5、TIMESTAMP
TIMESTAMP的顯示格式與DATETIME相同,顯示寬度固定在19個字符,日期格式為YYYY-MM-DD HH:MM:SS, 在存儲時需要4字節(jié)。TIMESTAMP 列的取值范圍小于DATETIME的取值范圍:‘1970-01-01 00:00:01’ UTC~‘2038-01-19 03:14:07’UTC.其中,UTC (Coordinated
Universal Time)為世界標準時間,因此在插入數(shù)據(jù)時,要保證在合法的取值范圍內。
創(chuàng)建數(shù)據(jù)表tmp7,定義數(shù)據(jù)類型為TIMESTAMP的字段ts,向表中插入值’19950101010101’,’950505050505’,’1996-02-02 02:02:02’,’97@03@03 03@03@03’,121212121212,NOW(),SQL語句如下:
mysql> CREATE TABLE tmp7( ts TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO tmp7 values ('19950101010101'),
-> ('950505050505'),
-> ('1996-02-02 02:02:02'),
-> ('97@03@03 03@03@03'),
-> (121212121212),
-> ( NOW() );
Query OK, 6 rows affected, 1 warning (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 1
查看插入結果:
mysql> SELECT * FROM tmp7;
+---------------------+
| ts |
+---------------------+
| 1995-01-01 01:01:01 |
| 1995-05-05 05:05:05 |
| 1996-02-02 02:02:02 |
| 1997-03-03 03:03:03 |
| 2012-12-12 12:12:12 |
| 2022-08-05 15:18:34 |
+---------------------+
6 rows in set (0.00 sec)
1.4、MySQL字符串與文本類型
字符串類型用來存儲字符串數(shù)據(jù),除了可以存儲字符串數(shù)據(jù)之外,還可以存儲其它數(shù)據(jù),比如圖片和聲音的二進制數(shù)據(jù)。
CHAR、VARCHAR、BINARY、VARBINARY
BLOB、TEXT、ENUM和SET。
MySQL支持兩類字符型數(shù)據(jù):文本字符串和二進制字符串。
文本字符串類型是指CHAR、VARCHAR、TEXT、ENUM和SET。
類型名稱 | 說明 | 存儲需求 |
---|---|---|
CHAR(M) | 固定長度非二進制字符串 | M字節(jié),1≤M≤255 |
VARCHAR(M) | 變長非二進制字符串 | L+1字節(jié),在此L≤M和1≤M≤255 |
TINYTEXT | 非常小的非二進制字符串 | L+1字節(jié),在此L<2^8 |
TEXT | 小的非一進制字符串 | L+2字節(jié),在此L<2^16 |
MEDIUMTEXT | 中等大小的非二進制字 符串 | L+3字節(jié),在此L<2^24 |
LONGTEXT | 大的非二進制字符串 | L+4字節(jié),在此L<2^32 |
ENUM | 枚舉類型,只能有一個枚舉字符串值 | 1或2字節(jié),取決于枚舉值的數(shù)目最大值為65535 |
SET | 一個設置,字符串對象可以有零個或 多個SET成員 | 1、 2、3、4或8字節(jié),取決于集合成員的數(shù)量,最多為64個成員 |
1、CHAR
CHAR(M)為固定長度字符串,在定義時指定字符串列長。當保存時在右側填充空格,以達到指定的長度。M表示列長度,M的范圍是0-255個字符。例如,CHAR(4)定義了一個固定長度的字符串列,其包含的字符個數(shù)最大為4。當檢索到CHAR值時,尾部的空格將被刪除。
2、VARCHAR
VARCHAR(M)是長度可變的字符串,M表示最大列長度。M的范圍是0~-65535. VARCHAR的最大實際長度由最長的行的大小和使用的字符集確定,而其實際占用的空間為字符串的實際長度加1。例如,VARCHAR(50)定義了一個最大長度為 50的字符串, 如果插入的字符串只有 10個字符,則實際存儲的字符串為10個字符和一一個字 符串結束字符。VARCHAR在值保存和檢索時尾部的空格仍保留。
創(chuàng)建tmp8表,定義字段ch和vch數(shù)據(jù)類型依次為CHAR(4)、VARCHAR(4)向表中插入數(shù)據(jù)“ab ”,SQL語句如下:
創(chuàng)建表tmp8:
mysql> CREATE TABLE tmp8(
-> ch CHAR(4),
-> vch VARCHAR(4)
-> );
Query OK, 0 rows affected (0.01 sec)
輸入數(shù)據(jù):
mysql> INSERT INTO tmp8 VALUES('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
查詢結果:
mysql> SELECT concat('(', ch, ')'), concat('(',vch,')') FROM tmp8;
+----------------------+---------------------+
| concat('(', ch, ')') | concat('(',vch,')') |
+----------------------+---------------------+
| (ab) | (ab ) |
+----------------------+---------------------+
1 row in set (0.00 sec)
3、TEXT
TEXT列保存非二進制字符串,如文章內容、評論等。當保存或查詢TEXT列的值時,不刪除尾部空格。Text類型分為4種: TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT.不同的TEXT類型的存儲空間和數(shù)據(jù)長度不同。
4、ENUM
ENUM是一個字符串對象, 其值為表創(chuàng)建時在列規(guī)定中枚革的一列值。 請法格式如下:
字段名ENUM(‘值1’, 值2…值n’)
其中,“字段名” 指將要定義的字段,“值 n”指枚舉列表中的第n個值。ENUM 類型的字段在取值時,只能在指定的枚舉列表中取,而且一次只能取個。 創(chuàng)建的成員中有空格時, 其尾部的空格將自動被刪除。ENUM值在內部用整數(shù)表示,并且每個枚舉值均有一個索引值:列表值所允許的成員值從1開始編號,MySQL存儲的就是這個索引編號。枚舉最多可以有65535個元素。
創(chuàng)建表tmp9,定義ENUM類型的列enm(‘first’,‘second’,‘third’),查看列成員的索引值,SQL語句如下:
首先,創(chuàng)建tmp9表:
mysql> CREATE TABLE tmp9( enm ENUM('first','second','third') );
Query OK, 0 rows affected (0.01 sec)
插入各個列值:
mysql> INSERT INTO tmp9 values('first'),('second') ,('third') , (NULL);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
查看索引值:
SELECT enm, enm+0 FROM tmp9;
mysql> SELECT enm, enm+0 FROM tmp9;
+--------+-------+
| enm | enm+0 |
+--------+-------+
| first | 1 |
| second | 2 |
| third | 3 |
| NULL | NULL |
+--------+-------+
4 rows in set (0.00 sec)
創(chuàng)建表tmp10,定義INT類型的soc字段,ENUM類型的字段level,列表值為(‘excellent’,‘good’, ‘bad’),向表tmp10中插入數(shù)據(jù)(70,‘good’)、(90,1)、(75,2)、(50,3) 、(100,‘best’),SQL語句如下:
首先,創(chuàng)建數(shù)據(jù)表:
mysql> CREATE TABLE tmp10 (soc INT, level enum('excellent', 'good','bad') );
Query OK, 0 rows affected (0.01 sec)
插入數(shù)據(jù):
mysql> INSERT INTO tmp10 values(70,'good'), (90,1),(75,2),(50,3);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
再次插入數(shù)據(jù):
mysql> INSERT INTO tmp10 values (100,'best');
ERROR 1265 (01000): Data truncated for column 'level' at row 1
這里系統(tǒng)提示錯誤信息,可以看到,由于字符串值“best”不在ENUM列表中,所以對數(shù)據(jù)進行了阻止插入操作,查詢結果如下:
mysql> SELECT * FROM tmp10;
+------+-----------+
| soc | level |
+------+-----------+
| 70 | good |
| 90 | excellent |
| 75 | good |
| 50 | bad |
+------+-----------+
4 rows in set (0.00 sec)
5、SET
SET是一個字符串對象,可以有零或多個值。SET列最多可以有64個成員,其值為表創(chuàng)建時規(guī)定的一列值。 指定包括多個SET成員的SET列值時,各成員之間用逗號()間隔開。語法格式如
SET('值1',值2'.....值n')
與ENUM類型相同,SET值在內部用整數(shù)表示,列表中每一個值都有一個索引編號。 當創(chuàng)建表時,SET 成員值的尾部空格將自動被刪除。與ENUM類型不同的是,ENUM類型的字段只能從定義的列值中選擇一個值插入,而SET類型的列可從定義的列值中選擇多個字符的聯(lián)合。如果插入SET字段中列值有重復,則MySQL自動刪除重復的值:插入SET字段的值的順序并不重要,MySQL會在存入數(shù)據(jù)庫時按照定義的順序顯示;如果插入了不正確的值,默認情況下,MySQL將忽視這些值,并給出警告。
創(chuàng)建表tmp11,定義SET類型的字段s,取值列表為(‘a’, ‘b’, ‘c’, ‘d’),插入數(shù)據(jù)(‘a’),(‘a,b,a’),(‘c,a,d’),(‘a,x,b,y’),SQL語句如下:
首先創(chuàng)建表tmp11:
mysql> CREATE TABLE tmp11 ( s SET('a', 'b', 'c', 'd'));
Query OK, 0 rows affected (0.01 sec)
插入數(shù)據(jù):
mysql> INSERT INTO tmp11 values('a'),( 'a,b,a'),('c,a,d');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
再次插入數(shù)據(jù):
mysql> INSERT INTO tmp11 values ('a,x,b,y');
ERROR 1265 (01000): Data truncated for column 's' at row 1
由于插入了SET列不支持的值,因此MySQL給出錯誤提示。
查看結果:
mysql> SELECT * FROM tmp11;
+-------+
| s |
+-------+
| a |
| a,b |
| a,c,d |
+-------+
3 rows in set (0.00 sec)
1.5、MySQL二進制類型
前面講解了存儲文本的字符串類型,這一節(jié)將講解MySQL中存儲二進制數(shù)據(jù)的數(shù)據(jù)類型
BIT、BINARY、VARBINARY、TINYBLOB、
BLOB、MEDIUMBLOB、LONGBLOB,
類型名稱 | 說明 | 存儲需求 |
---|---|---|
BIT(M) | 位字段類型 | 大約(M+7)/8字節(jié) |
BINARY(M) | 固定長度二進制字符串 | M字節(jié) |
VARBINARY(M) | 可變長度二進制字符串 | M+1字節(jié) |
TINYBLOB(M) | 非常小的BLOB | L+1字節(jié),在此L<2^8 |
BLOB(M) | 小BLOB | L+2字節(jié),在此L<2^16 |
MEDIUMBLOB(M) | 中等大小的BLOB | L+3字節(jié),在此L<2^24 |
LONGBLOB(M) | 非常大的BLOB | L+4字節(jié),在此L<2^32 |
1、BIT類型
BIT類型是位字段類型。M表示每個值的位數(shù),范圍為1~64。如果M被省略,默認為1。如果為BIT(M)列分配的值的長度小于M位,
就在值的左邊用0填充。例如,為BIT(6)列分配一個值b’101’,其效果與分配b0001相同。BIT 數(shù)據(jù)類型用來保存位字段值。例如,以二進制的形式保存數(shù)據(jù)13 (13的二進制形式為1101),在這里需要位數(shù)至少為4位的BIT類型,即可以定義列類型為BIT(4),大于二進制1111的數(shù)據(jù)是不能插入BIT(4)類型的字段中的。
創(chuàng)建表tmp12,定義BIT(4)類型的字段b,向表中插入數(shù)據(jù)2、9、15、16。
首先創(chuàng)建表tmp12,SQL語句如下:
mysql> CREATE TABLE tmp12( b BIT(4) );
Query OK, 0 rows affected (0.01 sec)
插入數(shù)據(jù):
mysql> INSERT INTO tmp12 VALUES(2), (9), (15);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
查詢插入結果:
mysql> SELECT BIN(b+0) FROM tmp12;
+----------+
| BIN(b+0) |
+----------+
| 10 |
| 1001 |
| 1111 |
+----------+
3 rows in set (0.00 sec)
2、 BINARY和VARBINARY類型
BINARY和VARBINARY類型類似于CHAR和VARCHAR,不同的是它們包含二進制字節(jié)
字符串。其使用的語法格式如下:
列名稱BINARY (M)或者VARBINARY (M)
BINARY類型的長度是固定的,指定長度之后,不足最大長度的,將在它們右邊填充‘\0’齊以達到指定長度。例如:指定列數(shù)據(jù)類型為BINARY(3),當插入‘a’時,存儲的內容實際為“a\0\0",當插入“ab” 時,實際存儲的內容為“ab\0”,不管存儲的內容是否達到指定的長度,其存儲空間
VARBINARY類型的長度是可變的,指定好長度之后,其長度可以在0到最大值之間。例如: 指定列數(shù)據(jù)類型為VARBINARY(20),如果插入的值的長度只有10,則實際存儲空間為10加1,即實際占用的空間為字符串的實際長度加1。
創(chuàng)建表tmp13,定義BINARY(3)類型的字段b和VARBINARY(3)類型的字段vb,并向表中插入數(shù)據(jù)’5’,比較兩個字段的存儲空間。
首先創(chuàng)建表tmp13,輸入SQL語句如下:
mysql> CREATE TABLE tmp13(
-> b binary(3),
-> vb varbinary(30)
-> );
Query OK, 0 rows affected (0.01 sec)
插入數(shù)據(jù):
mysql> INSERT INTO tmp13 VALUES(5,5);
Query OK, 1 row affected (0.00 sec)
查看兩個字段存儲數(shù)據(jù)的長度:
mysql> SELECT length(b), length(vb) FROM tmp13;
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
| 3 | 1 |
+-----------+------------+
1 row in set (0.00 sec)
mysql> SELECT b,vb,b = '5', b='5\0\0',vb='5',vb = '5\0\0' FROM tmp13;
+------------+------------+---------+-----------+--------+--------------+
| b | vb | b = '5' | b='5\0\0' | vb='5' | vb = '5\0\0' |
+------------+------------+---------+-----------+--------+--------------+
| 0x350000 | 0x35 | 0 | 1 | 1 | 0 |
+------------+------------+---------+-----------+--------+--------------+
1 row in set (0.00 sec)
3、BLOB類型
BLOB是一個二進制大對象,用來存儲可變數(shù)量的數(shù)據(jù)。BLOB類型分為4種: TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它們可容納值的最大長度不同,如下所示:
數(shù)據(jù)類型 | 存儲范圍 |
---|---|
TINYBLOB | 最大長度為255 (2^8-1) B |
BLOB | 最大長度為65535 (2^6-1) B |
MEDIUMBLOB | 最大長度為16777215 (2^24-1) B |
LONGBLOB | 最大長度為4294967295 (2^32 -1) B |
BLOB列存儲的是二進制字符串,
TEXT列存儲的是非二進制字符串。
BLOB列沒有字符集,并且排序和比較基于列值字節(jié)的數(shù)值;
TEXT列有一個字符集,并且根據(jù)字符集對值進行排序和比較。
2、 如何選擇數(shù)據(jù)類型
2.1、MySQL整數(shù)與浮點數(shù)的選擇
如果不需要小數(shù)部分,就使用整數(shù)來保存數(shù)據(jù):如果需要表示小數(shù)部分,就使用浮點數(shù)類型。對于浮點數(shù)據(jù)列,存入的數(shù)值會對該列定義的小數(shù)位進行四舍五入。例如,假設列的值的范圍為1~99999,若使用整數(shù),則MEDIUMINT UNSIGNED是最好的類型;若需要存儲小數(shù),則使用FLOAT類型。浮點類型包括FLOAT和DOUBLE類型。DOUBLE類型精度比FLOAT類型高,因此要求存儲精度較高時應選擇DOUBLE類型。
2.2、MySQL浮點數(shù)與定點數(shù)的選擇
浮點數(shù)FLOAT、DOUBLE相對于定點數(shù)DECIMAL的優(yōu)勢是:在長度一定的情況下, 浮點數(shù)能表示更大的數(shù)據(jù)范圍。由于浮點數(shù)容易產生誤差,因此對精確度要求比較高時,建議使用DECIMAL來存儲。DECIMAL在MySQL中是以字符串存儲的,用于定義貨幣等對精確度要求較高的數(shù)據(jù)。在數(shù)據(jù)遷移中,float(M,D)是 非標準SQL定義,數(shù)據(jù)庫遷移可能會出現(xiàn)問題,最好不要這樣使用。另外,兩個浮點數(shù)進行減法和比較運算時也容易出問題,因此在進行計算的時候,一定要小心。進行數(shù)值比較時,最好使用DECIMAL類型。
2.3、MySQL日期與時間類型的選擇
MySQL對于不同種類的日期和時間有很多數(shù)據(jù)類型,比如YEAR和TIME。如果只需要記錄年份,則使用YEAR類型即可;如果只記錄時間,則使用TIME類型。如果同時需要記錄日期和時間,則可以使用TIMESTAMP或者DATETIME類型。由于TIMESTAMP列的取值范圍小于DATETIME 的取值范圍,因此存儲范圍較大的日期最好使用
DATETIME.TIMESTAMP也有一個DATETIME不具備的屬性。默認的情況下,當插入一條記錄但并沒有指定TIMESTAMP這個列值時,MySQL會把TIMESTAMP列設為當前的時間。因此當需要插入記錄的同時插入當前時間時,使用TMESTAMP是方便的。另外,TIMESTAMP 在空間上比DATETIME更有效。
2.4、MySQL的CHAR和VARCHAR之間的選擇
CHAR是固定長度字符,VARCHAR 是可變長度字符。CHAR 會自動刪除插入數(shù)據(jù)的尾部空格,VARCHAR 不會刪除尾部空格。CHAR是固定長度,所以它的處理速度比VARCHAR的速度要快,但是它的缺點是浪費存儲存儲引擎對于選擇CHAR和VARCHAR的影響:對于MyISAM存儲引擎:最好使用固定長度的數(shù)據(jù)列代替可變長度的數(shù)據(jù)列。這樣可以使整個表靜態(tài)化,從而使數(shù)據(jù)檢索更快,用空間換時間。
對于InnoDB存儲引擎:使用可變長度的數(shù)據(jù)列,因為InnoDB數(shù)據(jù)表的存儲格式不分固定長度和可變長度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照實際的長度存儲的,比較節(jié)省空間,所以對磁盤I/O和數(shù)據(jù)存儲總量比較好。
2.5、MySQL的ENUM和SET的選擇
ENUM只能取單值,它的數(shù)據(jù)列表是一個枚舉集合。 它的合法取值列表最多 允許有65535個成員。因此,在需要從多個值中選取一個時, 可以使用ENUM。比如:性別字段適合定義為ENUM類型,每次只能從‘男’或‘女’中取一個值。SET可取多值。它的合法取值列表最多允許有64個成員??兆址彩且粋€合法的SET值。在需要取多個值的時候,適合使用SET類型,比如要存儲一個人的興趣愛好,最好使用SET類型。ENUM和SET的值是以字符串形式出現(xiàn)的,但在內部,MySQL 是以數(shù)值的形式存儲它們的。
2.6、MySQL的BLOB和TEXT的選擇
BLOB是二進制字符串,TEXT是非二進制字符串,兩者均可存放大容量的信息。BLOB 主要
存儲圖片、音頻信息等,而TEXT只能存儲純文本文件。
3、綜合案例-MySQL數(shù)據(jù)庫的數(shù)據(jù)類型的使用
1、案例要求
創(chuàng)建數(shù)據(jù)庫myData,按照下面數(shù)據(jù)表格的要求創(chuàng)建數(shù)據(jù)表:myTable。
myTable表結構
字段名 | 數(shù)據(jù)類型 | 主鍵 | 外鍵 | 非空 | 唯一 | 自增 |
---|---|---|---|---|---|---|
myInt | INT(10) | 否 | 否 | 否 | 否 | 否 |
myFloat | FLOAT(5,2) | 否 | 否 | 否 | 否 | 否 |
myTime | TIME | 否 | 否 | 否 | 否 | 否 |
myChar | CHAR(10) | 否 | 否 | 否 | 否 | 否 |
myBinary | binary(5) | 否 | 否 | 否 | 否 | 否 |
通過MySQL數(shù)據(jù)庫的數(shù)據(jù)類型的使用,來達到掌握有關MySQL數(shù)據(jù)庫的數(shù)據(jù)類型使用的能力。其具體要求如下所示:
1、創(chuàng)建數(shù)據(jù)庫myData
2、創(chuàng)建數(shù)據(jù)表myTable
3、向數(shù)據(jù)表myTable插入INT類型數(shù)據(jù)
4、向數(shù)據(jù)表myTable插入FLOAT類型數(shù)據(jù)
5、向數(shù)據(jù)表myTable插入TIME類型數(shù)據(jù)
6、向數(shù)據(jù)表myTable插入CHAR類型數(shù)據(jù)
7、向數(shù)據(jù)表myTable插入BINARY類型數(shù)據(jù)
8、查詢數(shù)據(jù)表myTable的數(shù)據(jù)
2、案例實現(xiàn)過程
一、cmd環(huán)境運行MySQL語句
2.1、創(chuàng)建數(shù)據(jù)庫myData
mysql> CREATE DATABASE myData;
Query OK, 1 row affected (0.00 sec)
2.2、創(chuàng)建數(shù)據(jù)表myTable
mysql> USE myData;
Database changed
mysql> CREATE TABLE myTable
-> (
-> myInt INT(10),
-> myFloat FLOAT(5,2),
-> myTime TIME,
-> myChar CHAR(10),
-> myBinary BINARY(5)
-> );
Query OK, 0 rows affected, 2 warnings (0.01 sec)
2.3、向數(shù)據(jù)表myTable插入INT類型數(shù)據(jù)
向myInt字段插入數(shù)據(jù)
mysql> INSERT INTO myTable(myInt) VALUES(666);
Query OK, 1 row affected (0.00 sec)
查詢myInt字段結果如下
mysql> SELECT myInt FROM myTable;
+-------+
| myInt |
+-------+
| 666 |
+-------+
1 row in set (0.00 sec)
2.4、向數(shù)據(jù)表myTable插入FLOAT類型數(shù)據(jù)
向myFloat字段插入數(shù)據(jù)
mysql> INSERT INTO myTable(myFloat) VALUES(6.23);
Query OK, 1 row affected (0.00 sec)
查詢myFloat字段結果如下
mysql> SELECT myFloat FROM myTable;
+---------+
| myFloat |
+---------+
| NULL |
| 6.23 |
+---------+
2 rows in set (0.00 sec)
2.5、向數(shù)據(jù)表myTable插入TIME類型數(shù)據(jù)
向myTime字段插入數(shù)據(jù)
mysql> INSERT INTO myTable(myTime) VALUES('10:24:36');
Query OK, 1 row affected (0.00 sec)
查詢myTime字段結果如下
mysql> SELECT myTime FROM myTable;
+----------+
| myTime |
+----------+
| NULL |
| NULL |
| 10:24:36 |
+----------+
3 rows in set (0.00 sec)
2.6、向數(shù)據(jù)表myTable插入CHAR類型數(shù)據(jù)
向myChar字段插入數(shù)據(jù)
mysql> INSERT INTO myTable(myChar) VALUES('CHAR');
Query OK, 1 row affected (0.00 sec)
查詢myChar字段結果如下
mysql> SELECT myChar FROM myTable;
+--------+
| myChar |
+--------+
| NULL |
| NULL |
| NULL |
| CHAR |
+--------+
4 rows in set (0.00 sec)
2.7、向數(shù)據(jù)表myTable插入BINARY類型數(shù)據(jù)
向myBinary字段插入數(shù)據(jù)
mysql> INSERT INTO myTable(myBinary) VALUES(3);
Query OK, 1 row affected (0.00 sec)
查詢myBinary字段結果如下
mysql> SELECT myBinary FROM myTable;
+--------------------+
| myBinary |
+--------------------+
| NULL |
| NULL |
| NULL |
| NULL |
| 0x3300000000 |
+--------------------+
5 rows in set (0.00 sec)
2.8、查詢數(shù)據(jù)表myTable的數(shù)據(jù)
查詢myTable的數(shù)據(jù)結果如下
mysql> SELECT * FROM myTable;
+-------+---------+----------+--------+--------------------+
| myInt | myFloat | myTime | myChar | myBinary |
+-------+---------+----------+--------+--------------------+
| 666 | NULL | NULL | NULL | NULL |
| NULL | 6.23 | NULL | NULL | NULL |
| NULL | NULL | 10:24:36 | NULL | NULL |
| NULL | NULL | NULL | CHAR | NULL |
| NULL | NULL | NULL | NULL | 0x3300000000 |
+-------+---------+----------+--------+--------------------+
5 rows in set (0.00 sec)
2.9、運行過程如下
1、登入數(shù)據(jù)庫,創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表
2、向數(shù)據(jù)表中插入數(shù)據(jù)和查詢數(shù)據(jù)
二、Navicat 軟件環(huán)境運行MySQL語句
1、新建查詢
進入Navicat軟件好,新建一個創(chuàng)建數(shù)據(jù)庫的查詢。
在查詢中編寫如下的SQL語句,如下所示。
-- 1、創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE myData;
-- 2、創(chuàng)建數(shù)據(jù)表myTable
USE myData;
CREATE TABLE myTable
(
myInt INT(10),
myFloat FLOAT(5,2),
myTime TIME,
myChar CHAR(10),
myBinary BINARY(5)
);
-- 3、向數(shù)據(jù)表myTable插入INT類型數(shù)據(jù)
-- 向myInt字段插入數(shù)據(jù)
INSERT INTO myTable(myInt) VALUES(666);
-- 查詢myInt字段
SELECT myInt FROM myTable;
-- 4、向數(shù)據(jù)表myTable插入FLOAT類型數(shù)據(jù)
-- 向myFloat字段插入數(shù)據(jù)
INSERT INTO myTable(myFloat) VALUES(6.23);
-- 查詢myFloat字段結
SELECT myFloat FROM myTable;
-- 5、向數(shù)據(jù)表myTable插入TIME類型數(shù)據(jù)
-- 向myTime字段插入數(shù)據(jù)
INSERT INTO myTable(myTime) VALUES('10:24:36');
-- 查詢myTime字段
SELECT myTime FROM myTable;
-- 6、向數(shù)據(jù)表myTable插入CHAR類型數(shù)據(jù)
-- 向myChar字段插入數(shù)據(jù)
INSERT INTO myTable(myChar) VALUES('CHAR');
-- 查詢myChar字段
SELECT myChar FROM myTable;
-- 7、向數(shù)據(jù)表myTable插入BINARY類型數(shù)據(jù)
-- 向myBinary字段插入數(shù)據(jù)
INSERT INTO myTable(myBinary) VALUES(3);
-- 查詢myBinary字段
SELECT myBinary FROM myTable;
-- 8、查詢數(shù)據(jù)表myTable的數(shù)據(jù)
SELECT * FROM myTable;
2、運行過程
運行結果如下所示:
1、創(chuàng)建數(shù)據(jù)庫
2、創(chuàng)建數(shù)據(jù)表
3、插入和查詢數(shù)據(jù)
文章來源:http://www.zghlxwxcb.cn/news/detail-401785.html
4、總結
本文主要介紹了MySQL數(shù)據(jù)類型:
MySQL數(shù)據(jù)類型主要有整數(shù)類型、浮點類型、定點類型、日期和時間類型、字符串類型、文本類型和二進制類型。 使讀者可以很快掌握MySQL數(shù)據(jù)類型的基本使用方法。另外還介紹了分別使用cmd環(huán)境和Navicat軟件環(huán)境中使用MySQL數(shù)據(jù)庫的數(shù)據(jù)類型的方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-401785.html
到了這里,關于MySQL數(shù)據(jù)庫的數(shù)據(jù)類型和基于MySQL數(shù)據(jù)類型的綜合實例項目的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!