閱讀目錄返回頂部數(shù)值類型MySQL支持所有標(biāo)準(zhǔn)SQL數(shù)值數(shù)據(jù)類型。 這些類型包括嚴(yán)格數(shù)值數(shù)據(jù)類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數(shù)值數(shù)據(jù)類型(FLOAT、REAL和DOUBLE PRECISION)。 關(guān)鍵字INT是INTEGER的同義詞,關(guān)鍵字DEC是DECIMAL的同義詞。 MySQL支持的整數(shù)類型有TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個(gè)整數(shù)類型的存儲(chǔ)和范圍。 對(duì)于小數(shù)的表示,MYSQL分為兩種方式:浮點(diǎn)數(shù)和定點(diǎn)數(shù)。浮點(diǎn)數(shù)包括float(單精度)和double(雙精度),而定點(diǎn)數(shù)只有decimal一種,在mysql中以字符串的形式存放,比浮點(diǎn)數(shù)更精確,適合用來(lái)表示貨幣等精度高的數(shù)據(jù)。 BIT數(shù)據(jù)類型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。 ? ?
![]() # 創(chuàng)建表一個(gè)是默認(rèn)寬度的int,一個(gè)是指定寬度的int(5) mysql> create table t1 (id1 int,id2 int(5)); Query OK, 0 rows affected (0.02 sec) # 像t1中插入數(shù)據(jù)1,1 mysql> insert into t1 values (1,1); Query OK, 1 row affected (0.01 sec) # 可以看出結(jié)果上并沒(méi)有異常 mysql> select * from t1; ------ ------ | id1 | id2 | ------ ------ | 1 | 1 | ------ ------ 1 row in set (0.00 sec) # 那么當(dāng)我們插入了比寬度更大的值,會(huì)不會(huì)發(fā)生報(bào)錯(cuò)呢? mysql> insert into t1 values (111111,111111); Query OK, 1 row affected (0.00 sec) # 答案是否定的,id2仍然顯示了正確的數(shù)值,沒(méi)有受到寬度限制的影響 mysql> select * from t1; ------------ -------- | id1 | id2 | ------------ -------- | 0000000001 | 00001 | | 0000111111 | 111111 | ------------ -------- 2 rows in set (0.00 sec) # 修改id1字段 給字段添加一個(gè)unsigned表示無(wú)符號(hào) 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 | | ------- ------------------ ------ ----- --------- ------- 2 rows in set (0.01 sec) # 當(dāng)給id1添加的數(shù)據(jù)大于214748364時(shí),可以順利插入 mysql> insert into t1 values (2147483648,2147483647); Query OK, 1 row affected (0.00 sec) # 當(dāng)給id2添加的數(shù)據(jù)大于214748364時(shí),會(huì)報(bào)錯(cuò) mysql> insert into t1 values (2147483647,2147483648); ERROR 1264 (22003): Out of range value for column 'id2' at row 1int整數(shù)示例 ![]() # 創(chuàng)建表的三個(gè)字段分別為float,double和decimal參數(shù)表示一共顯示5位,小數(shù)部分占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,結(jié)果正常 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 | ------ ------ ------ 1 row in set (0.00 sec) # 向表中插入1.234,會(huì)發(fā)現(xiàn)4都被截?cái)嗔?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 | ------ ------ ------ 2 rows in set (0.00 sec) # 向表中插入1.235發(fā)現(xiàn)數(shù)據(jù)雖然被截?cái)?,但是遵循了四舍五入的?guī)則 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 | ------ ------ ------ 3 rows in set (0.00 sec) # 建新表去掉參數(shù)約束 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) # 發(fā)現(xiàn)decimal默認(rèn)值是(10,0)的整數(shù) mysql> select * from t3; ------- ------- ------ | id1 | id2 | id3 | ------- ------- ------ | 1.234 | 1.234 | 1 | ------- ------- ------ 1 row in set (0.00 sec) # 當(dāng)對(duì)小數(shù)位沒(méi)有約束的時(shí)候,輸入超長(zhǎng)的小數(shù),會(huì)發(fā)現(xiàn)float和double的區(qū)別 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 | --------- -------------------- ------ 2 rows in set (0.00 sec)小數(shù)示例 返回頂部 日期和時(shí)間類型表示時(shí)間值的日期和時(shí)間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每個(gè)時(shí)間類型有一個(gè)有效值范圍和一個(gè)"零"值,當(dāng)指定不合法的MySQL不能表示的值時(shí)使用"零"值。 TIMESTAMP類型有專有的自動(dòng)更新特性,將在后面描述。
![]() 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 | | ------- ---------- ------ ----- --------- ------- 3 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 | ------------ ---------- --------------------- 1 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 | ------------ ---------- --------------------- 2 rows in set (0.00 sec)date/time/datetime示例 ![]() mysql> create table 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 update CURRENT_TIMESTAMP | ------- ----------- ------ ----- ------------------- ----------------------------- 1 row in set (0.00 sec) # 插入數(shù)據(jù)null,會(huì)自動(dòng)插入當(dāng)前時(shí)間的時(shí)間 mysql> insert into t5 values (null); Query OK, 1 row affected (0.00 sec) mysql> select * from t5; --------------------- | id1 | --------------------- | 2018-09-21 14:56:50 | --------------------- 1 row in set (0.00 sec) #添加一列 默認(rèn)值是'0000-00-00 00:00:00' mysql> alter table t5 add id2 timestamp; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table t5 \G; *************************** 1. row *************************** Table: t5 Create Table: CREATE TABLE `t5` ( `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) ERROR: No query specified # 手動(dòng)修改新的列默認(rèn)值為當(dāng)前時(shí)間 mysql> alter table t5 modify id2 timestamp default current_timestamp; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table t5 \G; *************************** 1. row *************************** Table: t5 Create Table: CREATE TABLE `t5` ( `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `id2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) ERROR: No query specified mysql> insert into 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 | --------------------- --------------------- 2 rows in set (0.00 sec)timestamp示例 ![]() mysql> create table 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 update CURRENT_TIMESTAMP | ------- ----------- ------ ----- ------------------- ----------------------------- 1 row in set (0.01 sec) mysql> insert into t6 values (19700101080001); Query OK, 1 row affected (0.00 sec) mysql> select * from t6; --------------------- | t1 | --------------------- | 1970-01-01 08:00:01 | --------------------- 1 row in set (0.00 sec) # timestamp時(shí)間的下限是19700101080001 mysql> insert into t6 values (19700101080000); ERROR 1292 (22007): Incorrect datetime value: '19700101080000' for column 't1' at row 1 mysql> insert into t6 values ('2038-01-19 11:14:07'); Query OK, 1 row affected (0.00 sec) # timestamp時(shí)間的上限是2038-01-19 11:14:07 mysql> insert into 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>timestamp示例2 ![]() 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 | ------ 1 row in set (0.00 sec)year示例 ![]() 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 | --------------------- 4 rows in set (0.00 sec)datetime示例 返回頂部 字符串類型字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節(jié)描述了這些類型如何工作以及如何在查詢中使用這些類型。
CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長(zhǎng)度和是否尾部空格被保留等方面也不同。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫轉(zhuǎn)換。 CHAR列的長(zhǎng)度固定為創(chuàng)建表是聲明的長(zhǎng)度,范圍(0-255);而VARCHAR的值是可變長(zhǎng)字符串范圍(0-65535)。 ![]() 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) # 在檢索的時(shí)候char數(shù)據(jù)類型會(huì)去掉空格 mysql> select * from t9; ------ ------ | v | c | ------ ------ | ab | ab | ------ ------ 1 row in set (0.00 sec) # 來(lái)看看對(duì)查詢結(jié)果計(jì)算的長(zhǎng)度 mysql> select length(v),length(c) from t9; ----------- ----------- | length(v) | length(c) | ----------- ----------- | 4 | 2 | ----------- ----------- 1 row in set (0.00 sec) # 給結(jié)果拼上一個(gè)加號(hào)會(huì)更清楚 mysql> select concat(v,' '),concat(c,' ') from t9; --------------- --------------- | concat(v,' ') | concat(c,' ') | --------------- --------------- | ab | ab | --------------- --------------- 1 row in set (0.00 sec) # 當(dāng)存儲(chǔ)的長(zhǎng)度超出定義的長(zhǎng)度,會(huì)截?cái)?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 | ------ ------ 2 rows in set (0.00 sec)char/varchar示例 BINARY 和 VARBINARY 類似于 CHAR 和 VARCHAR,不同的是它們包含二進(jìn)制字符串而不要非二進(jìn)制字符串。也就是說(shuō),它們包含字節(jié)字符串而不是字符字符串。這說(shuō)明它們沒(méi)有字符集,并且排序和比較基于列值字節(jié)的數(shù)值值。 BLOB 是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù)。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區(qū)別在于可容納存儲(chǔ)范圍不同。 有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對(duì)應(yīng)的這 4 種 BLOB 類型,可存儲(chǔ)的最大長(zhǎng)度不同,可根據(jù)實(shí)際情況選擇。 返回頂部ENUM和SET類型ENUM中文名稱叫枚舉類型,它的值范圍需要在創(chuàng)建表時(shí)通過(guò)枚舉方式顯示。ENUM只允許從值集合中選取單個(gè)值,而不能一次取多個(gè)值。 SET和ENUM非常相似,也是一個(gè)字符串對(duì)象,里面可以包含0-64個(gè)成員。根據(jù)成員的不同,存儲(chǔ)上也有所不同。set類型可以允許值集合中任意選擇1或多個(gè)元素進(jìn)行組合。對(duì)超出范圍的內(nèi)容將不允許注入,而對(duì)重復(fù)的值將進(jìn)行自動(dòng)去重。
![]() ![]() mysql> create table t10 (name char(20),gender enum('female','male')); Query OK, 0 rows affected (0.01 sec) # 選擇enum('female','male')中的一項(xiàng)作為gender的值,可以正常插入 mysql> insert into t10 values ('nezha','male'); Query OK, 1 row affected (0.00 sec) # 不能同時(shí)插入'male,female'兩個(gè)值,也不能插入不屬于'male,female'的值 mysql> insert into t10 values ('nezha','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('抽煙','喝酒','燙頭','翻車')中的項(xiàng),并自帶去重功能 mysql> insert into t11 values ('yuan','燙頭,喝酒,燙頭'); Query OK, 1 row affected (0.01 sec) mysql> select * from t11; ------ --------------- | name | hobby | ------ --------------- | yuan | 喝酒,燙頭 | ------ --------------- 1 row in set (0.00 sec) # 不能選擇不屬于set('抽煙','喝酒','燙頭','翻車')中的項(xiàng), mysql> insert into t11 values ('alex','燙頭,翻車,看妹子'); ERROR 1265 (01000): Data truncated for column 'hobby' at row 1 ![]() ? 來(lái)源:https://www./content-2-253501.html |
|