1 數(shù)據(jù)類型分類
2 數(shù)值類型
2.1 tinyint 類型
數(shù)值測(cè)試
mysql> create table tt1(num tinyint);//建立表,num的類型是tinyint
Query OK, 0 rows affected (0.02 sec)
mysql> insert into tt1 values(1);//插入數(shù)值
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt1 values(128); // 越界插入,報(bào)錯(cuò)
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> select * from tt1;
+------+
| num |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
注:在MySQL中,如果輸入的數(shù)值不合法,會(huì)直接不允許插入。并不會(huì)像C/C++語言那樣發(fā)生截?cái)?。這也說明了,凡是MySQL有的數(shù)值,必定是合法的。
在MySQL中,整型可以指定是有符號(hào)的和無符號(hào)的,默認(rèn)是有符號(hào)的。
可以通過UNSIGNED來說明某個(gè)字段是無符號(hào)的無符號(hào)。
案例:
mysql> create table tt2(num tinyint unsigned);
mysql> insert into tt2 values(-1); -- 無符號(hào),范圍是: 0 - 255
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> 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)
其他類型同理,可以自行測(cè)試
注意:盡量不使用unsigned,對(duì)于int類型可能存放不下的數(shù)據(jù),int unsigned同樣可能存放不下,與其如此,還不如設(shè)計(jì)時(shí),將int類型提升為bigint類型。
2.2 bit 類型
語法:
bit[(M)] : 位字段類型。M表示每個(gè)值的位數(shù),范圍從1到64。如果M被忽略,默認(rèn)為1。
案例:
mysql> create table tt4 ( id int, a bit(8));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt4 values(10, 10);
Query OK, 1 row affected (0.01 sec)
mysql> select * from tt4; #發(fā)現(xiàn)很怪異的現(xiàn)象,a的數(shù)據(jù)10沒有出現(xiàn)
+------+------+
| id | a |
+------+------+
| 10 | |
+------+------+
1 row in set (0.00 sec)
bit使用的注意事項(xiàng):
bit字段在顯示時(shí),是按照ASCII碼對(duì)應(yīng)的值顯示。
mysql> insert into tt4 values(65, 65);
mysql> select * from tt4;
+------+------+
| id | a |
+------+------+
| 10 | |
| 65 | A |
+------+------+
如果我們有這樣的值,只存放0或1,這時(shí)可以定義bit(1)。這樣可以節(jié)省空間。
mysql> create table tt5(gender bit(1));
mysql> insert into tt5 values(0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt5 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt5 values(2); -- 當(dāng)插入2時(shí),已經(jīng)越界了
ERROR 1406 (22001): Data too long for column 'gender' at row 1
2.3 小數(shù)類型
1)float
語法:
float[(m, d)] [unsigned] : M指定顯示長度,d指定小數(shù)位數(shù),占用空間4個(gè)字節(jié)
案例:
小數(shù):float(4,2)表示的范圍是-99.99 ~ 99.99,MySQL在保存值時(shí)會(huì)進(jìn)行四舍五入。
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); #多的這一點(diǎn)被拿掉了
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)
案例:
如果定義的是float(4,2) unsigned 這時(shí),因?yàn)榘阉付闊o符號(hào)的數(shù),范圍是 0 ~ 99.99
mysql> create table tt7(id int, salary float(4,2) unsigned);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt7 values(100, -0.1);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+-------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------+
| Warning | 1264 | Out of range value for column 'salary' at row 1 |
+---------+------+-------------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into tt7 values(100, -0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt7 values(100, 99.99);
Query OK, 1 row affected (0.00 sec)
2) decimal
語法:
decimal(m, d) [unsigned] : 定點(diǎn)數(shù)m指定長度,d表示小數(shù)點(diǎn)的位數(shù)
decimal(5,2) 表示的范圍是 -999.99 ~ 999.99
decimal(5,2) unsigned 表示的范圍 0 ~ 999.99
decimal和float很像,但是有區(qū)別:
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);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt8;
+------+-------------+-------------+
| id | salary | salary2 |
+------+-------------+-------------+
| 100 | 23.12345695 | 23.12345612 | # 發(fā)現(xiàn)decimal的精度更準(zhǔn)確,因此如果我們希望某個(gè)數(shù)據(jù)表示高精度,選擇decimal
+------+-------------+-------------+
說明:float表示的精度大約是7位。
decimal整數(shù)最大位數(shù)m為65。支持小數(shù)最大位數(shù)d是30。如果d被省略,默認(rèn)為0.如果m被省略,默認(rèn)是10。
建議:如果希望小數(shù)的精度高,推薦使用decimal。
2.4 字符串類型
1) char
語法:
char(L): 固定長度字符串,L是可以存儲(chǔ)的長度,單位為字符,最大長度值可以為255
案例:
mysql> create table tt9(id int, name char(2));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into tt9 values(100, 'ab');
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt9 values(101, '中國');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt9;
+------+--------+
| id | name |
+------+--------+
| 100 | ab |
| 101 | 中國 |
+------+--------+
注意:mysql中的字符,指的是一個(gè)符號(hào),不論是英文還是中文。
比如:‘a(chǎn)’ 是一個(gè)字符 ,'中’也是一個(gè)字符,雖然采用utf-8編碼英文占1個(gè)字節(jié),中文占3個(gè)字節(jié),但是在MySQL中,都認(rèn)為是一個(gè)字符,所以上面的案例中才能成功插入。
utf-8編碼中文占3個(gè)字節(jié),GBK編碼中文占2個(gè)字節(jié)
2.5 varchar
語法:
varchar(L): 可變長度字符串,L表示字符長度,最大長度65535個(gè)字節(jié)
注意:這里是65535個(gè)字節(jié),也就是最大長度是65535/3=21845個(gè)字符。(MySQL中,如果是UTF-8編碼一個(gè)字符最大可占3個(gè)字節(jié))
案例:
mysql> create table tt10(id int ,name varchar(6)); --表示這里可以存放6個(gè)字符
mysql> insert into tt10 values(100, 'hello');
mysql> insert into tt10 values(100, '我愛你,中國');
mysql> select * from tt10;
+------+--------------------+
| id | name |
+------+--------------------+
| 100 | hello |
| 100 | 我愛你,中國 |
+------+--------------------+
說明:
關(guān)于varchar(len),len到底是多大,這個(gè)len值,和表的編碼密切相關(guān)
varchar長度可以指定為0到65535之間的值,但是有1 - 3 個(gè)字節(jié)用于記錄數(shù)據(jù)大小,所以說有效字節(jié)數(shù)是65532。
當(dāng)我們的表的編碼是utf8時(shí),varchar(n)的參數(shù)n最大值是65532/3=21844[因?yàn)閡tf中,一個(gè)字符占用3個(gè)字節(jié)],如果編碼是gbk,varchar(n)的參數(shù)n最大是65532/2=32766(因?yàn)間bk中,一個(gè)字符
占用2字節(jié))。
mysql> create table tt11(name varchar(21845))charset=utf8; --驗(yàn)證了utf8確實(shí)是不能超過21844
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. You have to change some columns to
TEXT or BLOBs
mysql> create table tt11(name varchar(21844)) charset=utf8;
Query OK, 0 rows affected (0.01 sec)
2.6 char和varchar比較
如何選擇定長或變長字符串?
如果數(shù)據(jù)確定長度都一樣,就使用定長(char),比如:身份證,手機(jī)號(hào),md5
如果數(shù)據(jù)長度有變化,就使用變長(varchar), 比如:名字,地址,但是你要保證最長的能存的進(jìn)去。
定長的磁盤空間比較浪費(fèi),但是效率高。
變長的磁盤空間比較節(jié)省,但是效率低。
定長的意義是,直接開辟好對(duì)應(yīng)的空間
變長的意義是,在不超過自定義范圍的情況下,用多少,開辟多少。
2.6 日期和時(shí)間類型
常用的日期有如下三個(gè):
date :日期 ‘yyyy-mm-dd’ ,占用三字節(jié)
datetime 時(shí)間日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范圍從 1000 到 9999 ,占用八字節(jié)
timestamp :時(shí)間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用 四字節(jié)
案例
//創(chuàng)建表
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.01 sec)
//插入數(shù)據(jù):
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1'); --插入兩
種時(shí)間
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 | --添加數(shù)據(jù)時(shí),時(shí)間戳自動(dòng)補(bǔ)
上當(dāng)前時(shí)間
+------------+---------------------+---------------------+
//更新數(shù)據(jù):
mysql> update birthday set t1='2000-1-1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 2000-01-01 | 2008-08-08 12:01:01 | 2017-11-12 18:32:09 | -- 更新數(shù)據(jù),時(shí)間戳?xí)鲁僧?dāng)前時(shí)間
+------------+---------------------+---------------------+
2.6 enum 和 set
語法:
enum:枚舉,“單選”類型;
enum(‘選項(xiàng)1’,‘選項(xiàng)2’,‘選項(xiàng)3’,…);
該設(shè)定只是提供了若干個(gè)選項(xiàng)的值,最終一個(gè)單元格中,實(shí)際只存儲(chǔ)了其中一個(gè)值;而且出于效率考慮,這些值實(shí)際存儲(chǔ)的是“數(shù)字”,因?yàn)檫@些選項(xiàng)的每個(gè)選項(xiàng)值依次對(duì)應(yīng)如下數(shù)字:1,2,3,…最多65535 個(gè);當(dāng)我們添加枚舉值時(shí),也可以添加對(duì)應(yīng)的數(shù)字編號(hào)。
set:集合,“多選”類型;
set(‘選項(xiàng)值1’,‘選項(xiàng)值2’,‘選項(xiàng)值3’, …);
該設(shè)定只是提供了若干個(gè)選項(xiàng)的值,最終一個(gè)單元格中,設(shè)計(jì)可存儲(chǔ)了其中任意多個(gè)值;而且出于效率考慮,這些值實(shí)際存儲(chǔ)的是“數(shù)字”,因?yàn)檫@些選項(xiàng)的每個(gè)選項(xiàng)值依次對(duì)應(yīng)如下數(shù)字:1,2,4,8,16,32,… 最多64個(gè)
說明:不建議在添加枚舉值,集合值的時(shí)候采用數(shù)字的方式,因?yàn)椴焕陂喿x。
案例:
mysql> create table votes(
-> username varchar(30),
-> hobby set('登山','游泳','籃球','武術(shù)'),
-> gender enum('男','女'));
Query OK, 0 rows affected (0.02 sec)
插入數(shù)據(jù):
insert into votes values('雷鋒', '登山,武術(shù)', '男');
insert into votes values('Juse','登山,武術(shù)',2);
select * from votes where gender=2;//查找gender=2的數(shù)據(jù)
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| Juse | 登山,武術(shù) |女 |
+----------+---------------+--------+
2.6.1 集合查詢使用find_ in_ set函數(shù)
有如下數(shù)據(jù),想查找所有喜歡登山的人:
+-----------+---------------+--------+
| username | hobby | gender |
+-----------+---------------+--------+
| 雷鋒 | 登山,武術(shù) | 男 |
| Juse | 登山,武術(shù) | 女 |
| LiLei | 登山 | 男 |
| LiLei | 籃球 | 男 |
| HanMeiMei | 游泳 | 女 |
+-----------+---------------+--------+
使用如下查詢語句:
mysql> select * from votes where hobby='登山';
+----------+--------+--------+
| username | hobby | gender |
+----------+--------+--------+
| LiLei | 登山 | 男 |
+----------+--------+--------+
不能查詢出所有,愛好為登山的人。
集合查詢使用find_ in_ set函數(shù):
find_in_set(sub,str_list) :如果 sub 在 str_list 中,則返回下標(biāo);如果不在,返回0;
str_list :用逗號(hào)分隔的字符串。文章來源:http://www.zghlxwxcb.cn/news/detail-509980.html
mysql> select find_in_set('a', 'a,b,c');
+---------------------------+
| find_in_set('a', 'a,b,c') |
+---------------------------+
| 1 |
+---------------------------+
mysql> select find_in_set('d', 'a,b,c');
+---------------------------+
| find_in_set('d', 'a,b,c') |
+---------------------------+
| 0 |
+---------------------------+
查詢愛好登山的人:文章來源地址http://www.zghlxwxcb.cn/news/detail-509980.html
mysql> select * from votes where find_in_set('登山', hobby);
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| 雷鋒 | 登山,武術(shù) | 男 |
| Juse | 登山,武術(shù) | 女 |
| LiLei | 登山 | 男 |
+----------+---------------+--------+
到了這里,關(guān)于【MySQL學(xué)習(xí)筆記】(四)MySQL數(shù)據(jù)類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!