柚子快報(bào)激活碼778899分享:adb 【MySQL】數(shù)據(jù)類型
柚子快報(bào)激活碼778899分享:adb 【MySQL】數(shù)據(jù)類型
> 作者:?舊言~ > 座右銘:松樹千年終是朽,槿花一日自為榮。
> 目標(biāo):了解并掌握MYSQL的數(shù)據(jù)類型,并且能熟練創(chuàng)建表。
> 毒雞湯:有些事情,總是不明白,所以我不會(huì)堅(jiān)持。早安!
> 專欄選自:帶你玩轉(zhuǎn)MySQL
> 望小伙伴們點(diǎn)贊?收藏?加關(guān)注喲??
???
一、前言
想必大家在學(xué)校也學(xué)習(xí)過MySQL,可能學(xué)的懵懵懂懂,這個(gè)板塊我們從入門開始,從最新的安裝MySQL到學(xué)習(xí)MySQL語(yǔ)句,一步一步開始,一切都是新的,新的板塊新的開始,大家一起努力,一起進(jìn)步?。?!
?
??二、主體
學(xué)習(xí)【MySQL】數(shù)據(jù)類型咱們按照下面的圖解:
2.1數(shù)據(jù)類型分類
數(shù)值類型:用于存儲(chǔ)數(shù)值,包括整型和浮點(diǎn)型,如 int、double、float等。字符串類型:用于存儲(chǔ)字符串,包括固定長(zhǎng)度的char和可變長(zhǎng)度的varchar,以及blob和text類型等。日期和時(shí)間類型:用于存儲(chǔ)日期和時(shí)間,包括date、time、datetime、timestamp等。枚舉類型:用于存儲(chǔ)枚舉值,例如 enum型。集合類型:用于存儲(chǔ)一組值,例如set類型。注意:枚舉類型和集合類型都屬于字符串,因此它們被歸為了String類型。
2.2數(shù)值類型
2.2.1tinytin類型
語(yǔ)法:
create table t1(num tinyint);
使用:
數(shù)值越界測(cè)試:
mysql> insert into t1 values (127);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values (128);
1264 - Out of range value for column 'num' at row 1
mysql> insert into t1 values (-128);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values (0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values (100);
Query OK, 1 row affected (0.00 sec)
這里我們可以看到,如果插入的數(shù)據(jù)超過數(shù)值類型所能表示的范圍,MySQL將不允許該數(shù)據(jù)插入。因?yàn)闊o法得知該數(shù)據(jù)是截?cái)嗪蟮臄?shù)據(jù)還是未經(jīng)截?cái)嗟臄?shù)據(jù)。這里體現(xiàn)出了MySQL保證了數(shù)據(jù)庫(kù)中數(shù)據(jù)的可靠性。同時(shí),超過數(shù)據(jù)類型范圍的數(shù)據(jù)無法插入到表中也是一種 約束。約束是指在創(chuàng)建表時(shí)規(guī)定的對(duì)表中的數(shù)據(jù)進(jìn)行限制的條件。它可以對(duì)表中某列或某幾列添加一些限制條件,以保證表中的數(shù)據(jù)符合要求 ?
注意:
在MySQL中,整型可以指定是有符號(hào)的和無符號(hào)的,默認(rèn)是有符號(hào)的??梢酝ㄟ^unsigned來說明某個(gè)字段是無符號(hào)的。
2.2.2bit類型
語(yǔ)法:
位字段類型。M表示每個(gè)值的位數(shù),范圍從1到64。如果M被忽略,默認(rèn)為1。
使用:
mysql> create table if not exists t3(
-> id int,
-> online bit(1)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t3 (id,online) values (1,0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t3 (id,online) values (2,1);
Query OK, 1 row affected (0.01 sec)
mysql> insert into t3 (id,online) values (3,2);
ERROR 1406 (22001): Data too long for column 'online' at row 1
mysql> select* from t3;
+------+--------+
| id | online |
+------+--------+
| 1 | |
| 2 | |
+------+--------+
解釋:
這里對(duì)于插入越界的數(shù)據(jù)依舊是攔截不讓插入,還有這里的0/1不顯示,這是因?yàn)閎it字段在顯示時(shí),是按照ASCII碼對(duì)應(yīng)的值顯示,這里的0/1對(duì)應(yīng)的ASCII碼是不顯示的。
修改后:
create table t4(name varchar(32), gender bit(1));
2.2.3小數(shù)類型
2.2.3.1float
語(yǔ)法:
float[(m, d)] [unsigned] : M指定顯示長(zhǎng)度,d指定小數(shù)位數(shù),占用空間4個(gè)字節(jié)。
舉個(gè)栗子:float(4,2)表示的范圍是-99.99 ~ 99.99,MySQL在保存值時(shí)會(huì)進(jìn)行四舍五入
mysql> create table if not exists t4(
-> id int,
-> salary float(4,2)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t4 (id,salary) values (1,-99.99);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t4 (id,salary) values (2,99.99);
Query OK, 1 row affected (0.01 sec)
mysql> insert into t4 (id,salary) values (2,23.145);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t4 (id,salary) values (2,-99.994);
Query OK, 1 row affected (0.01 sec)
mysql> insert into t4 (id,salary) values (2,-99.995);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> insert into t4 (id,salary) values (2,99.994);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t4 (id,salary) values (2,99.995);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> select* from t4;
+------+--------+
| id | salary |
+------+--------+
| 1 | -99.99 |
| 2 | 99.99 |
| 2 | 23.14 |
| 2 | -99.99 |
| 2 | 99.99 |
+------+--------+
說明:
會(huì)發(fā)現(xiàn)對(duì)于超過指定位數(shù)的,會(huì)四舍五入進(jìn)行保存,保存后的數(shù)據(jù)只要在范圍內(nèi)就可以正常插入,不在范圍的就會(huì)直接攔截,況且float對(duì)于數(shù)據(jù)有時(shí)是不能準(zhǔn)確保存的 。如果定義的是float(4,2) unsigned 這時(shí),因?yàn)榘阉付闊o符號(hào)的數(shù),范圍是 0 ~ 99.99?
2.2.4decimal
語(yǔ)法:
decimal(m, d) [unsigned] : 定點(diǎn)數(shù)m指定長(zhǎng)度,d表示小數(shù)點(diǎn)的位數(shù)
decimal(5,2) 表示的范圍是 -999.99 ~ 999.99
使用:
mysql> create table if not exists t5(
-> id int,
-> s1 float(10,8),
-> s2 decimal(10,8)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t5 (id,s1,s2) values (1,23.12345612,23.12345612);
Query OK, 1 row affected (0.00 sec)
mysql> select* from t5;
+------+-------------+-------------+
| id | s1 | s2 |
+------+-------------+-------------+
| 1 | 23.12345695 | 23.12345612 |
+------+-------------+-------------+
說明:
float表示的精度大約是7位。decimal整數(shù)最大位數(shù)m為65。支持小數(shù)最大位數(shù)d是30。如果d被省略,默認(rèn)為0.如果m被省略,默認(rèn)是10。建議:如果希望小數(shù)的精度高,推薦使用decimal。
2.3字符串類型
2.3.1char
語(yǔ)法:
固定長(zhǎng)度字符串,L是可以存儲(chǔ)的長(zhǎng)度,單位為字符,最大長(zhǎng)度值可以為255。
在utf8編碼當(dāng)中,一個(gè)漢字為一個(gè)字符,一個(gè)字符為三字節(jié)
舉個(gè)栗子:
mysql> create table t6(
-> id int,
-> name char(3)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t6 (id,name) values (1,'中');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t6 (id,name) values (1,'中國(guó)');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t6 (id,name) values (1,'中國(guó)人');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t6 (id,name) values (1,'中國(guó)人民');
ERROR 1406 (22001): Data too long for column 'name' at row 1
2.3.2varchar
語(yǔ)法:
可變長(zhǎng)度字符串,L表示字符長(zhǎng)度,最大長(zhǎng)度65535個(gè)字節(jié)
舉個(gè)栗子:
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)
解釋:
變長(zhǎng)字符串是指長(zhǎng)度可變的字符串,即字符串長(zhǎng)度不固定,可以根據(jù)實(shí)際需要存儲(chǔ)不同長(zhǎng)度的字符數(shù)據(jù)。varchar 類型的字段會(huì)根據(jù)存儲(chǔ)的實(shí)際數(shù)據(jù)長(zhǎng)度來占用相應(yīng)的存儲(chǔ)空間,因此它比 char 類型更加靈活,能夠在存儲(chǔ)短字符串時(shí)占用更少的存儲(chǔ)空間。varchar(len) 所能夠容納的最大字符數(shù)取決于所使用的字符集和校對(duì)規(guī)則,也就是 len 的最大值跟編碼形式有關(guān)。varchar 長(zhǎng)度可以指定為 0 到 65535 之間的值,但是有 1 - 3 個(gè)字節(jié)用于記錄數(shù)據(jù)大小,所以說有效字節(jié)數(shù)是 65532。當(dāng)我們的表的編碼是 utf8 時(shí),varchar(n) 的參數(shù) n 最大值是 65532 / 3 = 21844(因?yàn)?utf 中,一個(gè)字符占用 3 個(gè)字節(jié))。如果編碼是 gbk,varchar(n) 的參數(shù) n 最大是 65532 / 2 = 32766 (因?yàn)?gbk 中,一個(gè)字符占用 2 字節(jié))。
2.3.3char和varchar比較
圖解:
如何選擇定長(zhǎng)或變長(zhǎng)字符串?
如果數(shù)據(jù)確定長(zhǎng)度都一樣,就使用定長(zhǎng)(char),比如:身份證,手機(jī)號(hào),md5如果數(shù)據(jù)長(zhǎng)度有變化,就使用變長(zhǎng)(varchar), 比如:名字,地址,但是你要保證最長(zhǎng)的能存的進(jìn)去。定長(zhǎng)的磁盤空間比較浪費(fèi),但是效率高。變長(zhǎng)的磁盤空間比較節(jié)省,但是效率低。定長(zhǎng)的意義是,直接開辟好對(duì)應(yīng)的空間變長(zhǎng)的意義是,在不超過自定義范圍的情況下,用多少,開辟多少
2.3.4日期和時(shí)間類型
分類:
date:用于存儲(chǔ)日期(年、月、日)。其格式為 ‘YYYY-MM-DD’,其中 YYYY 表示四位年份,MM 表示月份(01-12),DD 表示日期(01-31)。date 數(shù)據(jù)類型占用 3 個(gè)字節(jié)。datetime:用于存儲(chǔ)日期和時(shí)間(年、月、日、時(shí)、分、秒)。其格式為 ‘YYYY-MM-DD HH:MM:SS’,其中 YYYY 表示四位年份,MM 表示月份(01-12),DD 表示日期(01-31),HH 表示小時(shí)(00-23),MM 表示分鐘(00-59),SS 表示秒(00-59)。datetime 數(shù)據(jù)類型占用 8 個(gè)字節(jié)。timestamp:用于存儲(chǔ)日期和時(shí)間(年、月、日、時(shí)、分、秒),且其值自動(dòng)隨系統(tǒng)時(shí)間的更改而更新。其格式與 datetime 相同,但是其取值范圍比 datetime 更小。timestamp 數(shù)據(jù)類型占用 4 個(gè)字節(jié)。時(shí)間戳(timestamp) 是一種特殊的數(shù)據(jù)類型,用于表示某個(gè)時(shí)間點(diǎn)。在 MySQL 中,時(shí)間戳通常指 Unix 時(shí)間戳,它表示自 1970 年 1 月 1 日 0 時(shí) 0 分 0 秒(UTC 時(shí)區(qū))起到某個(gè)時(shí)間點(diǎn)的秒數(shù)。在 MySQL 中,timestamp 類型可以自動(dòng)更新為當(dāng)前時(shí)間,比如在插入新記錄時(shí),可以將 timestamp 列設(shè)置為默認(rèn)值 CURRENT_TIMESTAMP,這樣每當(dāng)插入一條新記錄時(shí),該列的值都會(huì)自動(dòng)更新為當(dāng)前時(shí)間。
舉個(gè)栗子:
mysql> create table t7(
-> t1 date,
-> t2 datetime,
-> t3 timestamp
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t7 (t1,t2) values ('2003-08-15','2008-08-10 12:01:01');
Query OK, 1 row affected (0.01 sec)
mysql> select* from t7;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 2003-08-15 | 2008-08-10 12:01:01 | 2024-09-13 09:33:34 |
+------------+---------------------+---------------------+
1 row in set (0.01 sec)
mysql> update t7 set t1='1999-12-31'; #更新數(shù)據(jù);
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select* from t7;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 1999-12-31 | 2008-08-10 12:01:01 | 2024-09-13 09:34:30 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> create table if not exists t8(
-> context text,
-> time timestamp
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t8 (context) values ('中國(guó)人民');
Query OK, 1 row affected (0.00 sec)
mysql> select* from t8;
+--------------+---------------------+
| context | time |
+--------------+---------------------+
| 中國(guó)人民 | 2024-09-13 09:36:39 |
+--------------+---------------------+
1 row in set (0.00 sec)
mysql> update t8 set context='中國(guó)人民站起來了'; #更新數(shù)據(jù)
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select* from t8;
+--------------------------+---------------------+
| context | time |
+--------------------------+---------------------+
| 中國(guó)人民站起來了 | 2024-09-13 09:37:27 |
+--------------------------+---------------------+
1 row in set (0.00 sec)
2.3.5enum和set
解釋:
enum 是一種多選一的數(shù)據(jù)類型,它可以存儲(chǔ)一個(gè)固定的選項(xiàng)列表中的一個(gè)值,支持最多 65535 個(gè)元素,每個(gè)元素的長(zhǎng)度不超過 65535 個(gè)字節(jié)。在創(chuàng)建表時(shí),可以使用 enum(column_name,‘option1’,‘option2’,…) 指定列名和選項(xiàng)列表,其中列名是必須的,選項(xiàng)列表中至少要有一個(gè)選項(xiàng)。出于效率考慮,這些值實(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 是一種多選多的數(shù)據(jù)類型,它可以存儲(chǔ)一個(gè)固定的選項(xiàng)列表中的多個(gè)值,支持最多 64 個(gè)元素,每個(gè)元素的長(zhǎng)度不超過 64 個(gè)字節(jié)。在創(chuàng)建表時(shí),可以使用 set(column_name,‘option1’,‘option2’,…) 指定列名和選項(xiàng)列表,其中列名是必須的,選項(xiàng)列表中至少要有一個(gè)選項(xiàng)。出于效率考慮,這些值實(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。\n示例:\n有一個(gè)調(diào)查表 votes,需要調(diào)查人的喜好, 比如在集合(唱,跳,rap,打籃球)中去選擇(可以多選),同時(shí)填表人還需要填寫自己的性別男或女(單選)。
舉個(gè)栗子:
mysql> create table if not exists t9(
-> name varchar(20),
-> gender enum('男','女'),
-> hobby set('代碼','羽毛球','乒乓球','足球')
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t9 (name,gender,hobby) values ('劉備','男','代碼');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t9 (name,gender,hobby) values ('孫尚香','女','代碼,羽毛球');
Query OK, 1 row affected (0.00 sec)
#插入enum和set中不存在的值就會(huì)報(bào)錯(cuò)
mysql> insert into t9 (name,gender,hobby) values ('劉禪','unknown','代碼,羽毛球');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> insert into t9 (name,gender,hobby) values ('劉禪','unknown','跑步');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
#enum在插入時(shí)可以寫枚舉常量值,也可以寫常量對(duì)應(yīng)下標(biāo)(從1開始)
mysql> insert into t9 (name,gender,hobby) values ('曹操',1,'代碼');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t9 (name,gender,hobby) values ('貂蟬',2,'代碼');
Query OK, 1 row affected (0.00 sec)
mysql> select* from t9;
+-----------+--------+------------------+
| name | gender | hobby |
+-----------+--------+------------------+
| 劉備 | 男 | 代碼 |
| 孫尚香 | 女 | 代碼,羽毛球 |
| 曹操 | 男 | 代碼 |
| 貂蟬 | 女 | 代碼 |
+-----------+--------+------------------+
#set值在用數(shù)字時(shí),是按照數(shù)字二進(jìn)制bit位是否為1進(jìn)行的
mysql> insert into t9 (name,gender,hobby) values ('孫權(quán)',1,1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t9 (name,gender,hobby) values ('周瑜',1,2);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t9 (name,gender,hobby) values ('趙云',1,3);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t9 (name,gender,hobby) values ('張飛',1,4);
Query OK, 1 row affected (0.01 sec)
mysql> insert into t9 (name,gender,hobby) values ('關(guān)羽',1,5);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t9 (name,gender,hobby) values ('黃忠',1,6);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t9 (name,gender,hobby) values ('馬超',1,15);
Query OK, 1 row affected (0.01 sec)
mysql> select* from t9;
+-----------+--------+-----------------------------------+
| name | gender | hobby |
+-----------+--------+-----------------------------------+
| 劉備 | 男 | 代碼 |
| 孫尚香 | 女 | 代碼,羽毛球 |
| 曹操 | 男 | 代碼 |
| 貂蟬 | 女 | 代碼 |
| 孫權(quán) | 男 | 代碼 |
| 周瑜 | 男 | 羽毛球 |
| 趙云 | 男 | 代碼,羽毛球 |
| 張飛 | 男 | 乒乓球 |
| 關(guān)羽 | 男 | 代碼,乒乓球 |
| 黃忠 | 男 | 羽毛球,乒乓球 |
| 馬超 | 男 | 代碼,羽毛球,乒乓球,足球 |
+-----------+--------+-----------------------------------+
查找:
使用select* from 表名 where 列名=常量/數(shù)字這樣查的話,是嚴(yán)格匹配去查找的,有多興趣的是查不出來的,此時(shí)就可以使用find_in_set函數(shù)來查詢find_in_set(sub,str_list) :如果 sub 在 str_list 中,則返回下標(biāo);如果不在,返回0; str_list 用逗號(hào)分隔的字符串。
查詢愛好中包含乒乓球的人:
mysql> select* from t9 where find_in_set('乒乓球',hobby);
+--------+--------+-----------------------------------+
| name | gender | hobby |
+--------+--------+-----------------------------------+
| 張飛 | 男 | 乒乓球 |
| 關(guān)羽 | 男 | 代碼,乒乓球 |
| 黃忠 | 男 | 羽毛球,乒乓球 |
| 馬超 | 男 | 代碼,羽毛球,乒乓球,足球 |
+--------+--------+-----------------------------------+
三、結(jié)束語(yǔ)?
? ? ? ?今天內(nèi)容就到這里啦,時(shí)間過得很快,大家沉下心來好好學(xué)習(xí),會(huì)有一定的收獲的,大家多多堅(jiān)持,嘻嘻,成功路上注定孤獨(dú),因?yàn)閳?jiān)持的人不多。那請(qǐng)大家舉起自己的小手給博主一鍵三連,有你們的支持是我最大的動(dòng)力???,回見。
?????
柚子快報(bào)激活碼778899分享:adb 【MySQL】數(shù)據(jù)類型
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。