四 .數據庫(數據類)

一. MySQL支持的數據類型

1.數值類型

MySQL支持全部標準SQL數值數據類型。

這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。

關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。

MySQL支持的整數類型有TINYINT、MEDIUMINT和BIGINT。下面的表顯示了須要的每一個整數類型的存儲和範圍。

對於小數的表示,MySQL分爲兩種方式:浮點數和定點數。浮點數包括float(單精度)和double(雙精度),而定點數只有decimal一種,在MySQL中以字符串的形式存放,比浮點數更精確,適合用來表示貨幣等精度高的數據。

BIT數據類型保存位字段值,而且支持MyISAM、MEMORY、InnoDB和BDB表

                                                   

2. INIT類型

# 建立表一個是默認寬度的int,一個是指定寬度的int(5)
mysql> create table t1 (id1 int,id2 int(5));
Query OK, 0 rows affected (0.02 sec)

# 像t1中插入數據1,1
mysql> insert into t1 values (1,1);
Query OK, 1 row affected (0.01 sec)

# 能夠看出結果上並無異常
mysql> select * from t1;
+------+------+
| id1  | id2  |
+------+------+
|    1 |    1 |
+------+------+
row in set (0.00 sec)

# 那麼當咱們插入了比寬度更大的值,會不會發生報錯呢?
mysql> insert into t1 values (111111,111111);
Query OK, 1 row affected (0.00 sec)

# 答案是否認的,id2仍然顯示了正確的數值,沒有受到寬度限制的影響
mysql> select * from t1;
+------------+--------+
| id1        | id2    |
+------------+--------+
| 0000000001 |  00001 |
| 0000111111 | 111111 |
+------------+--------+
rows in set (0.00 sec)

# 修改id1字段 給字段添加一個unsigned表示無符號    unsigned 就是將數字類型無符號化, 例如 int 型的範圍:-2^31 ~ 2^31 - 1,而unsigned int的範圍:0 ~ 2^32。看起來unsigned 是個不錯的類型
mysql> alter table t1 modify id1 int unsigned;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t1;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id1   | int(10) unsigned | YES  |     | NULL    |       |
| id2   | int(5)           | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
rows in set (0.01 sec)

# 當給id1添加的數據大於214748364時,能夠順利插入
mysql> insert into t1 values (2147483648,2147483647);
Query OK, 1 row affected (0.00 sec)

# 當給id2添加的數據大於214748364時,會報錯
mysql> insert into t1 values (2147483647,2147483648);
ERROR 1264 (22003): Out of range value for column 'id2' at row 1

3.FAOALT小數類型

float類型表示單精度浮點數值,double類型表示雙精度浮點數值,float和double都是浮點型,而decimal是定點型;

 DECIMAL數據類型用於在數據庫中存儲精確的數值。咱們常常將DECIMAL數據類型用於保留準確精確度的列,例如會計系統中的貨幣數據mysql

 
 

 double是mysql浮點類型數據的一種,double(6,2)表示規定顯示的值不會超過6位數字,小數點後面帶有2位數字sql

 MySQL 浮點型和定點型能夠用類型名稱後加(M,D)來表示,M表示該值的總共長度,D表示小數點後面的長度,M和D又稱爲精度和標度,如float(5,2)的
               可顯示爲999.99,MySQL保存值時會進行四舍五數據庫


#
建立表的三個字段分別爲float,double和decimal參數表示一共顯示5位,小數部分佔2位 mysql> create table t2 (id1 float(5,2),id2 double(5,2),id3 decimal(5,2)); Query OK, 0 rows affected (0.02 sec) # 向表中插入1.23,結果正常 mysql> insert into t2 values (1.23,1.23,1.23); Query OK, 1 row affected (0.00 sec) mysql> select * from t2; +------+------+------+ | id1 | id2 | id3 | +------+------+------+ | 1.23 | 1.23 | 1.23 | +------+------+------+ row in set (0.00 sec) # 向表中插入1.234,會發現4都被截斷了 mysql> insert into t2 values (1.234,1.234,1.234); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from t2; +------+------+------+ | id1 | id2 | id3 | +------+------+------+ | 1.23 | 1.23 | 1.23 | | 1.23 | 1.23 | 1.23 | +------+------+------+ rows in set (0.00 sec) # 向表中插入1.235發現數據雖然被截斷,可是遵循了四捨五入的規則 mysql> insert into t2 values (1.235,1.235,1.235); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from t2; +------+------+------+ | id1 | id2 | id3 | +------+------+------+ | 1.23 | 1.23 | 1.23 | | 1.23 | 1.23 | 1.23 | | 1.24 | 1.24 | 1.24 | +------+------+------+ rows in set (0.00 sec) # 建新表去掉參數約束 mysql> create table t3 (id1 float,id2 double,id3 decimal); Query OK, 0 rows affected (0.02 sec) # 分別插入1.234 mysql> insert into t3 values (1.234,1.234,1.234); Query OK, 1 row affected, 1 warning (0.00 sec) # 發現decimal默認值是(10,0)的整數 mysql> select * from t3; +-------+-------+------+ | id1 | id2 | id3 | +-------+-------+------+ | 1.234 | 1.234 | 1 | +-------+-------+------+ row in set (0.00 sec) # 當對小數位沒有約束的時候,輸入超長的小數,會發現float和double的區別 mysql> insert into t3 values (1.2355555555555555555,1.2355555555555555555,1.2355555555555555555555); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from t3; +---------+--------------------+------+ | id1 | id2 | id3 | +---------+--------------------+------+ | 1.234 | 1.234 | 1 | | 1.23556 | 1.2355555555555555 | 1 | +---------+--------------------+------+ rows in set (0.00 sec)

4. 時間日期類

表示時間值的日期和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每一個時間類型有一個有效值範圍和一個""值,當指定不合法的MySQL不能表示的值時使用""值。

TIMESTAMP類型有專有的自動更新特性,將在後面描述。

                                                             

 
 

Date:

       日期類型:系統使用三個字節來存儲數據,對應的格式爲:YYYY-mm-dd,能表示的範圍是從1000-01-01 到9999-12-12,初始值爲0000-00-00spa

 

Time:

       時間類型:可以表示某個指定的時間,可是系統一樣是提供3個字節來存儲,對應的格式爲:HH:ii:ss,可是mysql中的time類型可以表示時間範圍要大的多,設計

       能表示從-838:59:59~838:59:59,在mysql中具體的用處是用來描述時間段3d

 

Datetime:
         日期時間類型:就是將前面的date和time合併起來,表示的時間,使用8個字節存儲數據,格式爲YYYY-mm-dd HH:ii:ss,code

          能表示的區間1000-01-01 00:00:00 到9999-12-12 23:59:59,其能夠爲0值:0000-00-00 00:00:00對象


mysql> create table t4 (d date,t time,dt datetime); Query OK, 0 rows affected (0.02 sec) mysql> desc t4; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | d | date | YES | | NULL | | | t | time | YES | | NULL | | | dt | datetime | YES | | NULL | | +-------+----------+------+-----+---------+-------+ rows in set (0.01 sec) mysql> insert into t4 values (now(),now(),now()); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from t4; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 | +------------+----------+---------------------+ row in set (0.00 sec) mysql> insert into t4 values (null,null,null); Query OK, 1 row affected (0.01 sec) mysql> select * from t4; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 | | NULL | NULL | NULL | +------------+----------+---------------------+ rows in set (0.00 sec)

print("***************************************************************************************")
mysql> create table t8 (dt datetime);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t8 values ('2018-9-26 12:20:10');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t8 values ('2018/9/26 12+20+10');
Query OK, 1 row affected (0.00 sec)

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

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

mysql> select * from t8;
+---------------------+
| dt                  |
+---------------------+
| 2018-09-26 12:20:10 |
| 2018-09-26 12:20:10 |
| 2018-09-26 12:20:10 |
| 2018-09-26 12:20:10 |
+---------------------+
rows in set (0.00 sec)

 

.timestampblog

佔用4個字節
2. 容許爲空值,可是不能夠自定義值,因此爲空值時沒有任何意義。
3. TIMESTAMP值不能早於1970或晚於2037。這說明一個日期,例如'1968-01-01',雖然對於DATETIME或DATE值是有效的,但對於TIMESTAMP值卻無效,若是分配給這樣一個對象將被轉換爲0。
4.值以UTC格式保存( it stores the number of milliseconds)排序

5.時區轉化 ,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。

6. 默認值爲CURRENT_TIMESTAMP(),其實也就是當前的系統時間。
7. 數據庫會自動修改其值,因此在插入記錄時不須要指定timestamp字段的名稱和timestamp字段的值,你只須要在設計表的時候添加一個timestamp字段便可,插入後該字段的值會自動變爲當前系統時間。
8. 默認狀況下之後任什麼時候間修改表中的記錄時,對應記錄的timestamp值會自動被更新爲當前的系統時間。
9. 若是須要能夠設置timestamp不自動


mysql> createtable t5 (id1 timestamp); Query OK, 0 rows affected (0.02 sec) mysql> desc t5; +-------+-----------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+-------------------+-----------------------------+ | id1 | timestamp | NO | | CURRENT_TIMESTAMP | on updateCURRENT_TIMESTAMP | +-------+-----------+------+-----+-------------------+-----------------------------+rowinset (0.00 sec) # 插入數據null,會自動插入當前時間的時間 mysql> insertinto t5 values (null); Query OK, 1 row affected (0.00 sec) mysql> select * from t5; +---------------------+ | id1 | +---------------------+ | 2018-09-21 14:56:50 | +---------------------+ row in set (0.00 sec) #添加一列 默認值是'0000-00-00 00:00:00' mysql> altertable t5 add id2 timestamp; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> showcreatetable t5 \G; *************************** 1. row *************************** Table: t5 CreateTable: CREATETABLE`t5` ( `id1`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, `id2`timestampNOTNULLDEFAULT'0000-00-00 00:00:00' ) ENGINE=InnoDBDEFAULTCHARSET=utf8 rowinset (0.00 sec) ERROR: Noquery specified # 手動修改新的列默認值爲當前時間 mysql> altertable t5 modify id2 timestampdefaultcurrent_timestamp; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> showcreatetable t5 \G; *************************** 1. row *************************** Table: t5 CreateTable: CREATETABLE`t5` ( `id1`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, `id2`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP ) ENGINE=InnoDBDEFAULTCHARSET=utf8 rowinset (0.00 sec) ERROR: Noquery specified mysql> insertinto t5 values (null,null); Query OK, 1 row affected (0.01 sec) mysql> select * from t5; +---------------------+---------------------+ | id1 | id2 | +---------------------+---------------------+ | 2018-09-21 14:56:50 | 0000-00-00 00:00:00 | | 2018-09-21 14:59:31 | 2018-09-21 14:59:31 | +---------------------+---------------------+ rows in set (0.00 sec)

print("**********************************************************************************************************************************************")

mysql> createtable t6 (t1 timestamp); Query OK, 0 rows affected (0.02 sec) mysql> desc t6; +-------+-----------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+-------------------+-----------------------------+ | t1 | timestamp | NO | | CURRENT_TIMESTAMP | on updateCURRENT_TIMESTAMP | +-------+-----------+------+-----+-------------------+-----------------------------+rowinset (0.01 sec) mysql> insertinto t6 values (19700101080001); Query OK, 1 row affected (0.00 sec) mysql> select * from t6; +---------------------+ | t1 | +---------------------+ | 1970-01-01 08:00:01 | +---------------------+ row in set (0.00 sec) # timestamp時間的下限是19700101080001 mysql> insertinto t6 values (19700101080000); ERROR 1292 (22007): Incorrect datetime value: '19700101080000' for column 't1' at row 1 mysql> insertinto t6 values ('2038-01-19 11:14:07'); Query OK, 1 row affected (0.00 sec) # timestamp時間的上限是2038-01-19 11:14:07 mysql> insertinto t6 values ('2038-01-19 11:14:08'); ERROR 1292 (22007): Incorrect datetime value: '2038-01-19 11:14:08' for column 't1' at row 1 mysql>
year

mysql> create table t7 (y year); Query OK, 0 rows affected (0.02 sec) mysql> insert into t7 values (2018); Query OK, 1 row affected (0.00 sec) mysql> select * from t7; +------+ | y | +------+ | 2018 | +------+ row in set (0.00 sec)

 5.字符串類型(str)

字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何工做以及如何在查詢中使用這些類型。
HAR 和 VARCHAR 類型相似,但它們保存和檢索的方式不一樣。它們的最大長度和是否尾部空格被保留等方面也不一樣。在存儲或檢索過程當中不進行大小寫轉換。

CHAR列的長度固定爲建立表是聲明的長度,範圍(0-255);而VARCHAR的值是可變長字符串範圍(0-65535)

                                                                       

char 固定長度 數據類型
varchar 可變長度 數據類型

mysql> create table t9 (v varchar(4),c char(4)); Query OK, 0 rows affected (0.01 sec) mysql> insert into t9 values ('ab ','ab '); Query OK, 1 row affected (0.00 sec) # 在檢索的時候char數據類型會去掉空格 mysql> select * from t9; +------+------+ | v | c | +------+------+ | ab | ab | +------+------+ row in set (0.00 sec) # 來看看對查詢結果計算的長度 mysql> select length(v),length(c) from t9; +-----------+-----------+ | length(v) | length(c) | +-----------+-----------+ | 4 | 2 | +-----------+-----------+ row in set (0.00 sec) # 給結果拼上一個加號會更清楚 mysql> select concat(v,'+'),concat(c,'+') from t9; +---------------+---------------+ | concat(v,'+') | concat(c,'+') | +---------------+---------------+ | ab + | ab+ | +---------------+---------------+ row in set (0.00 sec) # 當存儲的長度超出定義的長度,會截斷 mysql> insert into t9 values ('abcd ','abcd '); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from t9; +------+------+ | v | c | +------+------+ | ab | ab | | abcd | abcd | +------+------+ rows in set (0.00 sec)
BINARY 和 VARBINARY 相似於 CHAR 和 VARCHAR,不一樣的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,
而且排序和比較基於列值字節的數值值。 BLOB 是一個二進制大對象,能夠容納可變數量的數據。有
4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不一樣。 有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 類型,可存儲的最大長度不一樣,可根據實際狀況選擇。

 6. enum和set類型

enum ENUM只能取單值,它的數據列表是一個枚舉集合。它的合法取值列表最多容許有65535個成員。例如:ENUM("N","Y")表示,該數據列的取值要麼是"Y",要麼就是"N"

set SET可取多值。它的合法取值列表最多容許有64個成員。空字符串也是一個合法的SET值。

mysql> create table t10 (name char(20),gender enum('female','male')); Query OK, 0 rows affected (0.01 sec) # 選擇enum('female','male')中的一項做爲gender的值,能夠正常插入 mysql> insert into t10 values ('nick','male'); Query OK, 1 row affected (0.00 sec) # 不能同時插入'male,female'兩個值,也不能插入不屬於'male,female'的值 mysql> insert into t10 values ('nick','male,female'); ERROR 1265 (01000): Data truncated for column 'gender' at row 1 mysql> create table t11 (name char(20),hobby set('抽菸','喝酒','燙頭','翻車')); Query OK, 0 rows affected (0.01 sec) # 能夠任意選擇set('抽菸','喝酒','燙頭','翻車')中的項,並自帶去重功能 mysql> insert into t11 values ('tank','燙頭,喝酒,燙頭'); Query OK, 1 row affected (0.01 sec) mysql> select * from t11; +------+---------------+ | name | hobby | +------+---------------+ | tank | 喝酒,燙頭 | +------+---------------+ row in set (0.00 sec) # 不能選擇不屬於set('抽菸','喝酒','燙頭','翻車')中的項, mysql> insert into t11 values ('jason','燙頭,翻車,看妹子'); ERROR 1265 (01000): Da
相關文章
相關標籤/搜索