目錄
- 數據類型
- tinyint類型(整形)
- bit類型
- 小數
- 浮點數 float、double
- decimal
- 字符串類型
- char
- varchar
- char與varchar的比較
- 日期時間類型
- enum和set
- 總結
數據類型
tinyint類型(整形)
例:
mysql> create table tt1(num tinyint);mysql> insert into tt1 values(1);mysql> insert into tt1 values(128); -- 越界插入,報錯
ERROR 1264 (22003): Out of range value for column 'num' at row 1mysql> select * from tt1;+------+| num |+------+| 1 |+------+1 row in set (0.00 sec)
- 在MySQL中,整型可以指定是有符號的和無符號的,默認是有符號的。
- 可以通過UNSIGNED來說明某個字段是無符號的
mysql> create table tt2(num tinyint unsigned);mysql> insert into tt2 values(-1); -- 無符號,范圍是: 0 - 255ERROR 1264 (22003): Out of range value for column 'num' at row 1mysql> insert into tt2 values(255);Query OK, 1 row affected (0.02 sec)mysql> select * from tt2;+------+| num |+------+| 255 |+------+1 row in set (0.00 sec)
bit類型
bit[(M)]
位字段類型
M表示每個值的位數,范圍從1到64。如果M被忽略,默認為1。
- bit字段在顯示時,是按照ASCII碼對應的值顯示。
mysql> insert into tt4 values(65, 65);mysql> select * from tt4;+------+------+| id | a |+------+------+| 10 | | | 65 | A |+------+------+
如果我們有這樣的值,只存放0或1,這時可以定義bit(1)。這樣可以節省空間
小數
浮點數 float、double
float[(m, d)] [unsigned]
M指定顯示長度
d指定小數位數,占用空間4個字節
- 如float(4,2)表示的范圍是-99.99 ~ 99.99
- MySQL在保存值時會進行四舍五入,四舍五入超過范圍則會失敗
mysql> create table tt6(id int, salary float(4,2));Query OK, 0 rows affected (0.01 sec)mysql> insert into tt6 values(100, -99.99);Query OK, 1 row affected (0.00 sec)mysql> insert into tt6 values(101, -99.991);Query OK, 1 row affected (0.00 sec)mysql> select * from tt6;+------+--------+| id | salary |+------+--------+| 100 | -99.99 || 101 | -99.99 |+------+--------+2 rows in set (0.00 sec)
- double與float類似,只是精度更高,占8字節
decimal
decimal(m, d) [unsigned]
定點數m指定長度,d表示小數點的位數
- decimal和float區別:
float和decimal表示的精度不一樣
mysql> create table tt8 ( id int, salary float(10,8), salary2 decimal(10,8));mysql> insert into tt8 values(100,23.12345612, 23.12345612);mysql> create table tt8 ( id int, salary float(10,8), salary2 decimal(10,8));mysql> select * from tt8;+------+-------------+-------------+
| id | salary | salary2 |
+------+-------------+-------------+
| 100 | 23.12345695 | 23.12345612 |
+------+-------------+-------------+
- float表示的精度大約是7位
- decimal整數最大位數m為65。支持小數最大位數d是30。如果d被省略,默認為0.如果m被省略,默認是10
- 如果希望小數的精度高,可以使用decimal
字符串類型
char
char(L):
固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值可以為255
- 注意:MySQL中的字符和我們在語言中學的字符是不一樣的,語言中的字符指的是一個字節的數據,但MySQL中的字符就真的代表一個字符,無論你是‘a’還是‘中’,都是一個字符
mysql> create table tt9(id int, name char(2));mysql> insert into tt9 values(100, 'ab');mysql> insert into tt9 values(101, '中國');mysql> insert into tt9 values(101, '中');mysql> select * from tt9;
+------+--------+
| id | name |
+------+--------+
| 100 | ab |
| 101 | 中國 |
| 101 | 中 |
+------+--------+
varchar
varchar(L)
可變長度字符串
L表示字符長度,最大長度65535個字節,注意單位是字節,char,單位是字符
mysql> create table tt10(id int ,name varchar(6)); --表示這里可以存放6個字符mysql> insert into tt10 values(100, 'hello'); mysql> insert into tt10 values(100, '我愛你,中國');mysql> select * from tt10;+------+--------------------+| id | name |+------+--------------------+| 100 | hello || 100 | 我愛你,中國 |+------+--------------------+
char與varchar的比較
- char是定長的,你定義多長他就會分配多大的空間
- varchar是可變的,你定義的只是它的上限,實際上它的空間會根據的數據的大小而變化,也就是給多少用多少
那在平時我們該如何選擇使用哪一種呢?
- 定長的磁盤空間比較浪費,但是效率高。
- 變長的磁盤空間比較節省,但是效率低。
所以,如果數據確定長度都一樣,就使用定長(char),比如:身份證,手機號,md5
如果數據長度有變化,就使用變長(varchar), 比如:名字,地址,但是你要保證最長的能存的進去。
日期時間類型
date
‘yyyy-mm-dd’ ,占用三字節
datetime
時間日期格式
‘yyyy-mm-dd HH:ii:ss’
表示范圍從1000 到 9999 ,占用八字節
timestamp
時間戳,從1970年開始
yyyy-mm-dd HH:ii:ss
格式和datetime 完全一致,占用四字節
- timetamp 在使用時會自動更新,其他兩個需要外部插入
//建表
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp);Query OK, 0 rows affected (0.01 sec)//插入數據:
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1');
--插入兩種時間Query OK, 1 row affected (0.00 sec)mysql> select * from birthday;+------------+---------------------+---------------------+| t1 | t2 | t3 |+------------+---------------------+---------------------+| 1997-07-01 | 2008-08-08 12:01:01 | 2017-11-12 18:28:55 | +------------+---------------------+---------------------+--添加數據時,時間戳自動補上當前時間//更新數據:
mysql> update birthday set t1='2000-1-1';Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from birthday;+------------+---------------------+---------------------+| t1 | t2 | t3 |+------------+---------------------+---------------------+| 2000-01-01 | 2008-08-08 12:01:01 | 2017-11-12 18:32:09 | +------------+---------------------+---------------------+
-- 更新數據,時間戳會更新成當前時間
enum和set
enum
枚舉類型
enum(‘選項1’,‘選項2’,‘選項3’,…);
多選一類型
該設定只是提供了若干個選項的值,最終一個單元格中,實際只存儲了其中一個值;
而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,3,…最多65535個;
當我們添加枚舉值時,也可以添加對應的數字編號。
set
集合,“多選”類型;
set(‘選項值1’,‘選項值2’,‘選項值3’, …);
該設定只是提供了若干個選項的值,最終一個單元格中,設計可存儲了其中任意多個值;
而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,4,8,16,32,… 最多64個。
-
enum中只能插入枚舉類型中的數據,不能插入枚舉類型沒有的數據,字符或下標(從1開始)插入都行
-
set同樣也只能插入原有的數據,不過可以選擇單個或者多個一起插入
-
注意,enum中可以使用下標插入,但是set中是以位圖的方式插入的,如:2的二進制為00010,所以我們插入的是第二個數據
-
數據可以為NULL,也可以是空串
下面是一個調查表實例,調查人的喜好與性別:
mysql> create table votes(-> username varchar(30),
-> hobby set('登山','游泳','籃球','武術'),
-> gender enum('男','女')); Query OK, 0 rows affected (0.02 sec)insert into votes values('雷鋒', '登山,武術', '男');insert into votes values('Juse','登山,武術',2);//插入數據
select * from votes where gender=2;+----------+---------------+--------+| username | hobby | gender |+----------+---------------+--------+| Juse | 登山,武術 |女 |+----------+---------------+--------+
查詢篩選語句:
1.enum
select * from votes where .......
mysql> select * from votes where gender='男';+----------+--------+--------+| username | hobby | gender |+----------+--------+--------+| LiLei | 登山 | 男 |+----------+--------+--------+
2.set
find_ in_ set函數
在一個集合中查找某一個元素是否存在,返回值為對應的下標
mysql> select find_in_set('a', 'a,b,c');mysql> select find_in_set('a', 'a,b,c');+---------------------------+| find_in_set('a', 'a,b,c') |+---------------------------+| 1 |+---------------------------+
所以我們查找時可以用該函數的返回值充當where的判斷值
mysql> select * from votes where find_in_set('登山', hobby);
找多個
mysql> select * from votes where find_in_set('登山', hobby) and find_in_set('羽毛球', hobby);
總結
其實數據類型就是MySQL中的一種天然的約束,滿足就可以插入