MySQL常見數(shù)據(jù)類型知識點舉例詳解
1.整數(shù)類型
整數(shù)類型默認都是有符號整數(shù)
類型名稱 | 字節(jié)數(shù) | 類型說明 |
---|---|---|
tinyint | 1 | 帶符號的范圍-128127,無符號范圍0255 |
smallint | 2 | 帶符號的范圍-2^15 ~ 2^15 - 1,無符號 2^16 - 1 |
mediumint | 3 | 帶符號的范圍-2^23 ~ 2^23 - 1,無符號 2^24 - 1 |
int | 4 | 帶符號的范圍-2^31 ~ 2^31 - 1,無符號 2^32 - 1 |
bigint | 8 | 帶符號的范圍-2^63 ~ 2^63 - 1,無符號 2^64 - 1 |
整數(shù)類型的可選屬性有三個:
- M : 表示顯示寬度,M的取值范圍是(0, 255)。例如,int(6):當數(shù)據(jù)寬度小于6位的時候在數(shù)字前面需要用字符填滿寬度。該項功能需要配合“ ZEROFILL ”使用,表示用“0”填滿寬度,否則指定顯示寬度無效。
- UNSIGNED : 無符號類型(非負),所有的整數(shù)類型都有一個可選的屬性UNSIGNED(無符號屬性),無符號整數(shù)類型的最小取值為0。所以,如果需要在MySQL數(shù)據(jù)庫中保存非負整數(shù)值時,可以將整數(shù)類型設(shè)置為無符號類型。
- ZEROFILL : 0填充,(如果某列是ZEROFILL,那么MySQL會自動為當前列添加UNSIGNED屬性),如果指定了ZEROFILL只是表示不夠M位時,用0在左邊填充,如果超過M位,只要不超過數(shù)據(jù)存儲范圍即可。在 int(M) 中,M 的值跟 int(M) 所占多少存儲空間并無任何關(guān)系。 int(3)、int(4)、int(8) 在磁盤上都是占用 4 bytes 的存儲空間。也就是說,int(M),必須和UNSIGNED ZEROFILL一起使用才有意義。如果整數(shù)值超過M位,就按照實際位數(shù)存儲。只是無須再用字符 0 進行填充
使用示例:
創(chuàng)建test表
create table test(num int(6) zerofill);
插入數(shù)據(jù):
insert into test values(22);
查看數(shù)據(jù):
select num from test;
結(jié)果:
mysql> select num from test -> ; +--------+ | num | +--------+ | 000022 | +--------+ 1 row in set (0.00 sec)
2.浮點數(shù)類型
浮點數(shù)和定點數(shù)類型的特點是可以處理小數(shù) ,你可以把整數(shù)看成小數(shù)的一個特例,因此,浮點數(shù)和定點數(shù)的使用場景,比整數(shù)大多了。 MySQL支持的浮點數(shù)類型,分別是 FLOAT、DOUBLE、REAL
類型名稱 | 字節(jié)數(shù) | 類型說明 |
---|---|---|
float | 4 | 表示單精度浮點數(shù) |
double | 8 | 表示雙精度浮點數(shù) |
real | 8/4 | 默認就是 double。如果把 SQL 模式設(shè)定為啟用“ REAL_AS_FLOAT ”,那么,MySQL 就認為real 是 float |
使用示例:
語法:
float[(m, d)] [unsigned] : M指定顯示長度,d指定小數(shù)位數(shù),占用空間4個字節(jié)
小數(shù):有符號float(4,2)表示的范圍是-99.99 ~ 99.99,無符號的float(4,2)表示的范圍是0 ~ 99.99,MySQL在保存值時會進行四舍五入
#創(chuàng)建表 create table tt6(id int, salary float(4,2)); #插入數(shù)據(jù) insert into tt6 values(100, -99.99); insert into tt6 values(101, -99.991); #多的這一點被拿掉了 #查詢數(shù)據(jù) select id, salary from tt6; #結(jié)果 +------+--------+ | id | salary | +------+--------+ | 100 | -99.99 | | 101 | -99.99 | +------+--------+ 2 rows in set (0.00 sec)
3.定點數(shù)類型
MySQL中的定點數(shù)類型只有 DECIMAL 一種類型。
語法:
decimal(M, D) [unsigned] : 定點數(shù)M指定長度,D表示小數(shù)點的位數(shù)
decimal(5,2) 表示的范圍是 -999.99 ~ 999.99
decimal(5,2) unsigned 表示的范圍 0 ~ 999.99 decimal和float很像,但是有區(qū)別:float和decimal表示的精度不一樣
0<=M<=65,0<=D<=30,D<M
DECIMAL(M,D)的最大取值范圍與DOUBLE類型一樣,但是有效的數(shù)據(jù)范圍是由M和D決定的。DECIMAL 的存儲空間并不是固定的,由精度值M決定,總共占用的存儲空間為M+2個字節(jié)。也就是說,在一些對精度要求不高的場景下,比起占用同樣字節(jié)長度的定點數(shù),浮點數(shù)表達的數(shù)值范圍可以更大一些。定點數(shù)在MySQL內(nèi)部是以 字符串 的形式進行存儲,這就決定了它一定是精準的。當DECIMAL類型不指定精度和標度時,其默認為DECIMAL(10,0)。當數(shù)據(jù)的精度超出了定點數(shù)類型的精度范圍時,則MySQL同樣會進行四舍五入處理
建議:如果希望小數(shù)的精度高,推薦使用decimal
4.bit類型
基本語法:
bit[(M)] : 位字段類型。M表示每個值的位數(shù),范圍從1到64。如果M被忽略,默認為1
使用示例:
#創(chuàng)建表 create table tt4(id int, a bit(8)); #插入數(shù)據(jù) insert into tt4 values(10, 10); #查詢數(shù)據(jù) select * from tt4; #結(jié)果 +------+------+ | id | a | +------+------+ | 10 | | +------+------+ 1 row in set (0.00 sec) #發(fā)現(xiàn)很怪異的現(xiàn)象,a的數(shù)據(jù)10沒有出現(xiàn)
bit使用的注意事項:
bit字段在顯示時,是按照ASCII碼對應(yīng)的值顯示
#插入數(shù)據(jù) insert into tt4 values(65, 65); #查詢結(jié)果 select * from tt4; +------+------+ | id | a | +------+------+ | 10 | | | 65 | A | +------+------+
5.字符串類型
5.1char和varchar類型
類型名稱 | 類型說明 |
---|---|
char | 固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值可以為255 |
varchar | 可變長度字符串,L表示字符長度,最大長度65535個字節(jié) |
char語法:
char(L)
char使用示例:
#創(chuàng)建表 create table tt9(id int, name char(2)); #插入數(shù)據(jù) insert into tt9 values(100, 'ab'); insert into tt9 values(101, '中國'); #查詢結(jié)果 mysql> select * from tt9; +------+--------+ | id | name | +------+--------+ | 100 | ab | | 101 | 中國 | +------+--------+
說明:
- char(2) 表示可以存放兩個字符,可以是字母或漢字,但是不能超過2個, 最多只能是255
varchar語法:
varchar(L)
varchar使用示例:
#創(chuàng)建表 create table tt10(id int ,name varchar(6)); #表示這里可以存放6個字符 #插入數(shù)據(jù) insert into tt10 values(100, 'hello'); insert into tt10 values(100, '我愛你,中國'); #查詢結(jié)果 mysql> select * from tt10; +------+--------------------+ | id | name | +------+--------------------+ | 100 | hello | | 100 | 我愛你,中國 | +------+--------------------+
說明:
關(guān)于varchar(len),len到底是多大,這個len值,和表的編碼密切相關(guān):
- varchar長度可以指定為0到65535之間的值,但是有1 - 3 個字節(jié)用于記錄數(shù)據(jù)大小,所以說有效字節(jié)數(shù)是65532
- 當我們的表的編碼是utf8時,varchar(n)的參數(shù)n最大值是65532/3=21844[因為utf中,一個字符占用3個字節(jié)],如果編碼是gbk,varchar(n)的參數(shù)n最大是65532/2=32766(因為gbk中,一個字符占用2字節(jié))
如何選擇定長或變長字符串?
- 如果數(shù)據(jù)確定長度都一樣,就使用定長(char),比如:身份證,手機號,md5
- 如果數(shù)據(jù)長度有變化,就使用變長(varchar), 比如:名字,地址,但是你要保證最長的能存的進去。定長的磁盤空間比較浪費,但是效率高。
- 變長的磁盤空間比較節(jié)省,但是效率低。
- 定長的意義是,直接開辟好對應(yīng)的空間
- 變長的意義是,在不超過自定義范圍的情況下,用多少,開辟多少
5.2日期類型和時間類型
常用的日期有如下三個:
- date :日期 ‘yyyy-mm-dd’ ,占用三字節(jié)
- datetime 時間日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范圍從 1000 到 9999 ,占用八字節(jié)
- timestamp :時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss 格式和 datetime完全一致,占用四字節(jié)
使用示例:
#創(chuàng)建表 create table birthday (t1 date, t2 datetime, t3 timestamp); #插入數(shù)據(jù) insert into birthday(t1,t2,t3) values('1997-7-1','2024-12-1 12:1:1','2024-12-1 12:1:1'); #查詢結(jié)果 mysql> select * from birthday; +------------+---------------------+---------------------+ | t1 | t2 | t3 | +------------+---------------------+---------------------+ | 1997-07-01 | 2024-12-01 12:01:01 | 2024-12-01 12:01:01 | +------------+---------------------+---------------------+ 1 row in set (0.00 sec)
TIMESTAMP類型通常占用4個字節(jié)的存儲空間,而DATETIME類型則需要8個字節(jié)。TIMESTAMP類型的精度可以指定,范圍從0到6,默認精度為6。這意味著TIMESTAMP可以存儲到微秒級別的時間戳,而DATETIME類型則不能指定精度
5.3enum和set類型
類型名稱 | 類型說明 |
---|---|
enum:枚舉 | 單選類型 |
set:集合 | 多選類型 |
ENUM類型也叫作枚舉類型,ENUM類型的取值范圍需要在定義字段時進行指定。設(shè)置字段值時,ENUM類型只允許從成員中選取單個值,不能一次選取多個值。其所需要的存儲空間由定義ENUM類型時指定的成員個數(shù)決定。當ENUM類型包含1~255個成員時,需要1個字節(jié)的存儲空間;當ENUM類型包含256~65535個成員時,需要2個字節(jié)的存儲空間;ENUM類型的成員個數(shù)的上限為65535個
SET表示一個字符串對象,可以包含0個或多個成員,但成員個數(shù)的上限為 64 。設(shè)置字段值時,可以取取值范圍內(nèi)的 0 個或多個值。當SET類型包含的成員個數(shù)不同時,其所占用的存儲空間也是不同的。SET類型在存儲數(shù)據(jù)時成員個數(shù)越多,其占用的存儲空間越大。注意:SET類型在選取成員時,可以一次選擇多個成員,這一點與ENUM類型不同
使用示例:
有一個調(diào)查表votes,需要調(diào)查人的喜好, 比如(登山,游泳,籃球,武術(shù))中去選擇(可以多選),使用set類型,(男,女)[單選] ,使用enum類型
#創(chuàng)建表
create table votes( username varchar(30), hobby set('登山','游泳','籃球','武術(shù)'), gender enum('男','女'));
#插入數(shù)據(jù)
insert into votes values('雷鋒', '登山,武術(shù)', '男'); insert into votes values('Juse','登山,武術(shù)',2);
#查詢
select * from votes where gender=2;
#查詢結(jié)果
+----------+---------------+--------+ | username | hobby | gender | +----------+---------------+--------+ | Juse | 登山,武術(shù) |女 | +----------+---------------+--------+
假如表中有這些數(shù)據(jù),想查找所有喜歡登山的人:
+-----------+---------------+--------+ | username | hobby | gender | +-----------+---------------+--------+ | 雷鋒 | 登山,武術(shù) | 男 | | Juse | 登山,武術(shù) | 女 | | LiLei | 登山 | 男 | | LiLei | 籃球 | 男 | | HanMeiMei | 游泳 | 女 | +-----------+---------------+--------+
使用如下查詢語句:
select * from votes where hobby='登山';
結(jié)果:
+----------+--------+--------+ | username | hobby | gender | +----------+--------+--------+ | LiLei | 登山 | 男 | +----------+--------+--------+
可以發(fā)現(xiàn)并不能查詢出所有喜歡登山的人
集合查詢使用find_ in_ set函數(shù):
語法:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,則返回下標;如果不在,返回0,str_list 用逗號分隔的字符串
查詢愛好登山的人:
mysql> select * from votes where find_in_set('登山', hobby); +----------+---------------+--------+ | username | hobby | gender | +----------+---------------+--------+ | 雷鋒 | 登山,武術(shù) | 男 | | Juse | 登山,武術(shù) | 女 | | LiLei | 登山 | 男 | +----------+---------------+--------+
總結(jié)
到此這篇關(guān)于MySQL常見數(shù)據(jù)類型的文章就介紹到這了,更多相關(guān)MySQL常見數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中的CONCAT()函數(shù):輕松拼接字符串的利器
這篇文章主要介紹了MySQL中的CONCAT()函數(shù):輕松拼接字符串的利器,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Centos7 安裝mysql 8.0.13(rpm)的教程詳解
這篇文章主要介紹了Centos7 安裝mysql 8.0.13(rpm)的教程詳解,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11避坑:Sql中?in?和not?in中有null值的情況說明
這篇文章主要介紹了避坑:Sql中?in?和not?in中有null值的情況說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07mysql數(shù)據(jù)庫表增添字段,刪除字段,修改字段的排列等操作
這篇文章主要介紹了mysql數(shù)據(jù)庫表增添字段,刪除字段,修改字段的排列等操作,修改表指的是修改數(shù)據(jù)庫之后中已經(jīng)存在的數(shù)據(jù)表的結(jié)構(gòu)2022-07-07Mysql根據(jù)某層部門ID查詢所有下級多層子部門的示例
這篇文章主要介紹了Mysql根據(jù)某層部門ID查詢所有下級多層子部門的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-12-12mysql基礎(chǔ):mysqld_safe 啟動執(zhí)行流程詳解
本篇文章是對mysql基礎(chǔ)中的mysqld_safe啟動執(zhí)行流程進行了詳細的分析介紹,需要的朋友參考下2013-06-06rpm -ivh方式安裝mysql并修改數(shù)據(jù)存儲位置的實現(xiàn)
在Linux環(huán)境下進行MySQL的安裝可以使用不同的方式,但在本文中我們將關(guān)注一種特定的方式,即通過RPM包的方式進行安裝,本文主要介紹了rpm -ivh方式安裝mysql并修改數(shù)據(jù)存儲位置的實現(xiàn),感興趣的可以了解一下2023-09-09