VARCHAR 和 CHAR 是兩種主要的字符串類(lèi)型,用于存儲(chǔ)字符。不幸的是,由于實(shí)現(xiàn)的方式依賴于存儲(chǔ)引擎,因此很難解釋這些字符串在磁盤(pán)和內(nèi)存中如何存儲(chǔ),除了除了常用的 InnoDB 和 MyISAM 外,假設(shè)你使用了其他存儲(chǔ)引擎,應(yīng)當(dāng)仔細(xì)閱讀存儲(chǔ)引擎的文檔。
10年積累的做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有綏德免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
VARCHAR 存儲(chǔ)可變長(zhǎng)度的字符串,也是最常用的字符數(shù)據(jù)類(lèi)型。相比固定長(zhǎng)度的類(lèi)型,VARCHAR 所需的存儲(chǔ)空間更小,它會(huì)盡可能少地使用存儲(chǔ)空間(例如,短的字符串占據(jù)的空間)。對(duì)于 MyISAM 來(lái)說(shuō),如果創(chuàng)建表的時(shí)候指定了 ROW_FORMAT=FIXED 的話,那么會(huì)使用固定的空間存儲(chǔ)字段而導(dǎo)致空間浪費(fèi)。VARCHAR 使用1-2個(gè)額外的字節(jié)存儲(chǔ)字符串的長(zhǎng)度:當(dāng)最大長(zhǎng)度低于255字節(jié)的時(shí)候使用1個(gè)字節(jié),如果更多的話就使用2個(gè)字節(jié)。因此,拉丁字符集的 VARCHAR(10)會(huì)使用11個(gè)字節(jié)的存儲(chǔ)空間,而 VARCHAR(1000)則會(huì)使用1002個(gè)字節(jié)的存儲(chǔ)空間。
VARCHAR 由于能夠節(jié)省空間,因此可以改善性能。但是,由于長(zhǎng)度可變,當(dāng)更新數(shù)據(jù)表的時(shí)候數(shù)據(jù)行的存儲(chǔ)空間會(huì)變化,這一定程度上會(huì)帶來(lái)額外的開(kāi)銷(xiāo)。如果數(shù)據(jù)行的長(zhǎng)度導(dǎo)致原有的存儲(chǔ)位置無(wú)法存放,那么不同的存儲(chǔ)引擎會(huì)做不同的處理。例如 MyISAM 可能產(chǎn)生數(shù)據(jù)行的碎片,而 InnoDB 需要進(jìn)行磁盤(pán)分頁(yè)來(lái)存放更新后的數(shù)據(jù)行。
通常,如果最大的列長(zhǎng)度遠(yuǎn)遠(yuǎn)高于平均長(zhǎng)度的話(例如可選的備注字段),使用 VARCHAR 是劃算的,同時(shí)如果更新的頻次很低,那么碎片化也不會(huì)是一個(gè)問(wèn)題。需要注意的是,如果使用的是 UTF-8字符集,則實(shí)際存儲(chǔ)的字節(jié)長(zhǎng)度是根據(jù)字符定的。對(duì)于中文,推薦的存儲(chǔ)字符集是 utf8mb4。
CHAR 類(lèi)型的長(zhǎng)度是固定的,MySQL 會(huì)對(duì)每個(gè)字段分配足夠的存儲(chǔ)空間。 存儲(chǔ)CHAR 類(lèi)型值的時(shí)候,MySQL 會(huì)移除后面多出來(lái)的空字符 。值是使用空字符進(jìn)行對(duì)齊以便進(jìn)行比較。對(duì)于短的字符串來(lái)說(shuō),使用 CHAR 更有優(yōu)勢(shì),而如果所有的值的長(zhǎng)度幾乎一致的話,就可以使用 CHAR。例如存儲(chǔ)用戶密碼的MD5值時(shí)使用 CHAR 就更合適,這是因?yàn)?MD5的長(zhǎng)度總是固定的。同時(shí),對(duì)于字段值經(jīng)常改變的數(shù)據(jù)類(lèi)型來(lái)說(shuō),CHAR 相比 VARCHAR 也更有優(yōu)勢(shì),因?yàn)?CHAR 不會(huì)產(chǎn)生碎片。對(duì)于很短的數(shù)據(jù)列,使用 CHAR 比 VARCHAR更高效,例如使用CHAR(1)存儲(chǔ)邏輯值的 Y 和 N,這種情況下只需要1個(gè)字節(jié),而 VARCHAR 需要2個(gè)字節(jié)。
對(duì)于移除空字符這個(gè)特性會(huì)感覺(jué)奇怪,我們舉個(gè)例子:
按上面的結(jié)果插入數(shù)據(jù)表后,string2中的前置空格不會(huì)移除,但使用 CHAR 類(lèi)型存儲(chǔ)時(shí),string3尾隨空格會(huì)被移除,使用 SQL 查詢結(jié)果來(lái)檢驗(yàn)一下:
得出來(lái)的結(jié)果如下,可以看到 CHAR 類(lèi)型的 string3后面的空格被移除了,而 VARCHAR類(lèi)型的沒(méi)有。這種情況大多數(shù)時(shí)候不會(huì)有什么問(wèn)題,實(shí)際在應(yīng)用中也經(jīng)常會(huì)使用 trim 函數(shù)移除兩端的空字符,但是如果確實(shí)需要存儲(chǔ)空格的時(shí)候,那就需要注意不要選擇使用 CHAR 類(lèi)型:
數(shù)據(jù)如何存儲(chǔ)是由存儲(chǔ)引擎決定的,而且存儲(chǔ)引擎處理固定長(zhǎng)度和可變長(zhǎng)度的數(shù)據(jù)的方式并不相同。Memory 引擎使用固定大小的行,因此它需要分配最大可能的存儲(chǔ)空間——即便數(shù)據(jù)長(zhǎng)度是可變的。但是,對(duì)于字符串的對(duì)齊和空字符截?cái)嗍怯?MySQL 服務(wù)端完成的,因此所有存儲(chǔ)引擎都是一樣的。
與 CHAR 和 VARCHAR 相似的是 BINARY和 VARBINARY,用于存儲(chǔ)二進(jìn)制字節(jié)字符,BINARY 的對(duì)齊使用字符0的字節(jié)值來(lái)對(duì)齊,并且再獲取值的時(shí)候不會(huì)截?cái)唷H绻枰褂米址淖止?jié)值而不是字符的話,使用 BINARY 會(huì)更高效,這是因?yàn)楸容^時(shí),一方面不需要考慮大小寫(xiě),另一方面是MySQL一次只比較一個(gè)字節(jié)。
MySQL 數(shù)據(jù)類(lèi)型細(xì)分下來(lái),大概有以下幾類(lèi):
數(shù)值,典型代表為 tinyint,int,bigint
浮點(diǎn)/定點(diǎn),典型代表為 float,double,decimal 以及相關(guān)的同義詞
字符串,典型代表為 char,varchar
時(shí)間日期,典型代表為 date,datetime,time,timestamp
二進(jìn)制,典型代表為 binary,varbinary
位類(lèi)型
枚舉類(lèi)型
集合類(lèi)型
大對(duì)象,比如 text,blob
json 文檔類(lèi)型
一、數(shù)值類(lèi)型(不是數(shù)據(jù)類(lèi)型,別看錯(cuò)了)如果用來(lái)存放整數(shù),根據(jù)范圍的不同,選擇不同的類(lèi)型。
以上是幾個(gè)整數(shù)選型的例子。整數(shù)的應(yīng)用范圍最廣泛,可以用來(lái)存儲(chǔ)數(shù)字,也可以用來(lái)存儲(chǔ)時(shí)間戳,還可以用來(lái)存儲(chǔ)其他類(lèi)型轉(zhuǎn)換為數(shù)字后的編碼,如 IPv4 等。示例 1用 int32 來(lái)存放 IPv4 地址,比單純用字符串節(jié)省空間。表 x1,字段 ipaddr,利用函數(shù) inet_aton,檢索的話用函數(shù) inet_ntoa。
查看磁盤(pán)空間占用,t3 占用最大,t1 占用最小。所以說(shuō)如果整數(shù)存儲(chǔ)范圍有固定上限,并且未來(lái)也沒(méi)有必要擴(kuò)容的話,建議選擇最小的類(lèi)型,當(dāng)然了對(duì)其他類(lèi)型也適用。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 3.0G3541825 861M -rw-r----- 1 mysql mysql 860M 12月 10 11:36 t1.ibd3541820 989M -rw-r----- 1 mysql mysql 988M 12月 10 11:38 t2.ibd3541823 1.2G -rw-r----- 1 mysql mysql 1.2G 12月 10 11:39 t3.ibd
二、浮點(diǎn)數(shù) / 定點(diǎn)數(shù)先說(shuō)?浮點(diǎn)數(shù),float 和 double 都代表浮點(diǎn)數(shù),區(qū)別簡(jiǎn)單記就是 float 默認(rèn)占 4 Byte。float(p) 中的 p 代表整數(shù)位最小精度。如果 p 24 則直接轉(zhuǎn)換為 double,占 8 Byte。p 最大值為 53,但最大值存在計(jì)算不精確的問(wèn)題。再說(shuō)?定點(diǎn)數(shù),包括 decimal 以及同義詞 numeric,定點(diǎn)數(shù)的整數(shù)位和小數(shù)位分別存儲(chǔ),有效精度最大不能超過(guò) 65。所以區(qū)別于 float 的在于精確存儲(chǔ),必須需要精確存儲(chǔ)或者精確計(jì)算的最好定義為 decimal 即可。示例 3創(chuàng)建一張表 y1,分別給字段 f1,f2,f3 不同的類(lèi)型。mysql-(ytt/3305)-create table y1(f1 float,f2 double,f3 decimal(10,2));Query OK, 0 rows affected (0.03 sec)
三、字符類(lèi)型字符類(lèi)型和整形一樣,用途也很廣。用來(lái)存儲(chǔ)字符、字符串、MySQL 所有未知的類(lèi)型??梢院?jiǎn)單說(shuō)是萬(wàn)能類(lèi)型!
char(10) 代表最大支持 10 個(gè)字符存儲(chǔ),varhar(10) 雖然和 char(10) 可存儲(chǔ)的字符數(shù)一樣多,不同的是 varchar 類(lèi)型存儲(chǔ)的是實(shí)際大小,char 存儲(chǔ)的理論固定大小。具體的字節(jié)數(shù)和字符集相關(guān)。示例 4例如下面表 t4 ,兩個(gè)字段 c1,c2,分別為 char 和 varchar。mysql-(ytt/3305)-create table t4 (c1 char(20),c2 varchar(20));Query OK, 0 rows affected (0.02 sec)
所以在 char 和 varchar 選型上,要注意看是否合適的取值范圍。比如固定長(zhǎng)度的值,肯定要選擇 char;不確定的值,則選擇 varchar。
四、日期類(lèi)型日期類(lèi)型包含了 date,time,datetime,timestamp,以及 year。year 占 1 Byte,date 占 3 Byte?!?/p>
time,timestamp,datetime 在不包含小數(shù)位時(shí)分別占用 3 Byte,4 Byte,8 Byte;小數(shù)位部分另外計(jì)算磁盤(pán)占用,見(jiàn)下面表格。
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
注意:timestamp 代表的時(shí)間戳是一個(gè) int32 存儲(chǔ)的整數(shù),取值范圍為 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999';datetime 取值范圍為 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。
綜上所述,日期這塊類(lèi)型的選擇遵循以下原則:
1. 如果時(shí)間有可能超過(guò)時(shí)間戳范圍,優(yōu)先選擇 datetime。2. 如果需要單獨(dú)獲取年份值,比如按照年來(lái)分區(qū),按照年來(lái)檢索等,最好在表中添加一個(gè) year 類(lèi)型來(lái)參與。3. 如果需要單獨(dú)獲取日期或者時(shí)間,最好是單獨(dú)存放,而不是簡(jiǎn)單的用 datetime 或者 timestamp。后面檢索時(shí),再加函數(shù)過(guò)濾,以免后期增加 SQL 編寫(xiě)帶來(lái)額外消耗。
4. 如果有保存毫秒類(lèi)似的需求,最好是用時(shí)間類(lèi)型自己的特性,不要直接用字符類(lèi)型來(lái)代替。MySQL 內(nèi)部的類(lèi)型轉(zhuǎn)換對(duì)資源額外的消耗也是需要考慮的。
示例 5
建立表 t5,對(duì)這些可能需要的字段全部分離開(kāi),這樣以后寫(xiě) SQL 語(yǔ)句的時(shí)候就很容易了。
當(dāng)然了,這種情形占用額外的磁盤(pán)空間。如果想在易用性與空間占用量大這兩點(diǎn)來(lái)折中,可以用 MySQL 的虛擬列來(lái)實(shí)時(shí)計(jì)算。比如假設(shè) c5 字段不存在,想要得到 c5 的結(jié)果。mysql-(ytt/3305)-alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1 ?Duplicates: 0 ?Warnings: 0
五、二進(jìn)制類(lèi)型
binary 和 varbinary 對(duì)應(yīng)了 char 和 varchar 的二進(jìn)制存儲(chǔ),相關(guān)的特性都一樣。不同的有以下幾點(diǎn):
binary(10)/varbinary(10) 代表的不是字符個(gè)數(shù),而是字節(jié)數(shù)。
行結(jié)束符不一樣。char 的行結(jié)束符是 \0,binary 的行結(jié)束符是 0x00。
由于是二進(jìn)制存儲(chǔ),所以字符編碼以及排序規(guī)則這類(lèi)就直接無(wú)效了。
示例 6
來(lái)看這個(gè) binary 存取的簡(jiǎn)單示例,還是之前的變量 @a。
切記!這里要提前計(jì)算好 @a 占用的字節(jié)數(shù),以防存儲(chǔ)溢出。
六、位類(lèi)型
bit 為 MySQL 里存儲(chǔ)比特位的類(lèi)型,最大支持 64 比特位, 直接以二進(jìn)制方式存儲(chǔ),一般用來(lái)存儲(chǔ)狀態(tài)類(lèi)的信息。比如,性別,真假等。具有以下特性:
1. 對(duì)于 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時(shí)可以直接十進(jìn)制來(lái)過(guò)濾數(shù)據(jù)。3. 如果此字段加上索引,MySQL 不會(huì)自己做類(lèi)型轉(zhuǎn)換,只能用二進(jìn)制來(lái)過(guò)濾。
示例 7
創(chuàng)建表 c1, 字段性別定義一個(gè)比特位。mysql-(ytt/3305)-create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)
mysql-(ytt/3305)-select cast(gender as unsigned) ?'f1' from c1;+------+| f1 ? |+------+| ? ?0 || ? ?1 |+------+2 rows in set (0.00 sec)
過(guò)濾數(shù)據(jù)也一樣,二進(jìn)制或者直接十進(jìn)制都行。mysql-(ytt/3305)-select conv(gender,16,10) as gender \???- from c1 where gender = b'1';?+--------+| gender |+--------+| 1??????|+--------+1 row in set (0.00 sec)????mysql-(ytt/3305)-select conv(gender,16,10) as gender \????- from c1 where gender = '1';+--------+| gender |+--------+| 1??????|+--------+1 row in set (0.00 sec)
其實(shí)這樣的場(chǎng)景,也可以定義為 char(0),這也是類(lèi)似于 bit 非常優(yōu)化的一種用法。
mysql-(ytt/3305)-create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)
那現(xiàn)在我給表 c1 簡(jiǎn)單的造點(diǎn)測(cè)試數(shù)據(jù)。
mysql-(ytt/3305)-select count(*) from c1;+----------+| count(*) |+----------+| 33554432 |+----------+1 row in set (1.37 sec)
把 c1 的數(shù)據(jù)全部插入 c2。
mysql-(ytt/3305)-insert into c2 select if(gender = 0,'',null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432 ?Duplicates: 0 ?Warnings: 0
兩張表的磁盤(pán)占用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2.ibd
檢索方式稍微有些不同,不過(guò)效率也差不多。所以說(shuō),字符類(lèi)型不愧為萬(wàn)能類(lèi)型。
七、枚舉類(lèi)型
枚舉類(lèi)型,也即 enum。適合提前規(guī)劃好了所有已經(jīng)知道的值,且未來(lái)最好不要加新值的情形。枚舉類(lèi)型有以下特性:
1. 最大占用 2 Byte。2. 最大支持 65535 個(gè)不同元素。3. MySQL 后臺(tái)存儲(chǔ)以下標(biāo)的方式,也就是 tinyint 或者 smallint 的方式,下標(biāo)從 1 開(kāi)始。4. 排序時(shí)按照下標(biāo)排序,而不是按照里面元素的數(shù)據(jù)類(lèi)型。所以這點(diǎn)要格外注意。
示例 8
創(chuàng)建表 t7。mysql-(ytt/3305)-create table t7(c1 enum('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.03 sec)
八、集合類(lèi)型
集合類(lèi)型 SET 和枚舉類(lèi)似,也是得提前知道有多少個(gè)元素。SET 有以下特點(diǎn):
1. 最大占用 8 Byte,int64。2. 內(nèi)部以二進(jìn)制位的方式存儲(chǔ),對(duì)應(yīng)的下標(biāo)如果以十進(jìn)制來(lái)看,就分別為 1,2,4,8,...,pow(2,63)。3. 最大支持 64 個(gè)不同的元素,重復(fù)元素的插入,取出來(lái)直接去重。4. 元素之間可以組合插入,比如下標(biāo)為 1 和 2 的可以一起插入,直接插入 3 即可。
示例 9
定義表 c7 字段 c1 為 set 類(lèi)型,包含了 8 個(gè)值,也就是下表最大為 pow(2,7)。
mysql-(ytt/3305)-create table c7(c1 set('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.02 sec)
插入 1 到 128 的所有組合。
mysql-(ytt/3305)-INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS ( ? ? ? ?SELECT 1 AS cnt ? ? ? ?UNION ALL ? ? ? ?SELECT cnt + 1 ? ? ? ?FROM ytt_number ? ? ? ?WHERE cnt pow(2, 7) ? ?)SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128 ?Duplicates: 0 ?Warnings: 0
九、數(shù)據(jù)類(lèi)型在存儲(chǔ)函數(shù)中的用法
函數(shù)里除了顯式聲明的變量外,默認(rèn) session 變量的數(shù)據(jù)類(lèi)型很弱,隨著給定值的不同隨意轉(zhuǎn)換。
示例 10
定義一個(gè)函數(shù),返回兩個(gè)給定參數(shù)的乘積。定義里有兩個(gè)變量,一個(gè)是 v_tmp 顯式定義為 int64,另外一個(gè) @vresult 隨著給定值的類(lèi)型隨意變換類(lèi)型。
簡(jiǎn)單調(diào)用下。
mysql-(ytt/3305)-select ytt_sample_data_type(1111,222) 'result';+--------------------------+| result ? ? ? ? ? ? ? ? ? |+--------------------------+| The result is: '246642'. |+--------------------------+1 row in set (0.00 sec)
總結(jié)
本篇把 MySQL 基本的數(shù)據(jù)類(lèi)型做了簡(jiǎn)單的介紹,并且用了一些容易理解的示例來(lái)梳理這些類(lèi)型。我們?cè)趯?shí)際場(chǎng)景中,建議選擇適合最合適的類(lèi)型,不建議所有數(shù)據(jù)類(lèi)型簡(jiǎn)單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。
一:MySQL數(shù)據(jù)類(lèi)型
MySQL中定義數(shù)據(jù)字段的類(lèi)型對(duì)你數(shù)據(jù)庫(kù)的優(yōu)化是非常重要的
MySQL支持多種數(shù)據(jù)類(lèi)型,大致可以分為三類(lèi):數(shù)值 日期/時(shí)間和字符串
二、數(shù)值類(lèi)型
1.整數(shù)類(lèi)型
2.浮點(diǎn)數(shù)
如果希望保證值比較準(zhǔn)確,推薦使用定點(diǎn)數(shù)數(shù)據(jù)類(lèi)型。MySql中的浮點(diǎn)類(lèi)型有float,double和real。他們定義方式為:FLOAT(M,D) 、 REAL(M,D) 、 DOUBLE PRECISION(M,D)。
FLOAT和DOUBLE中的M和D的取值默認(rèn)都為0,即除了最大最小值,不限制位數(shù)。允許的值理論上是-1.7976931348623157E+308~-2.2250738585072014E-308、0和2.2250738585072014E-308~1.7976931348623157E+308。M、D范圍如下:
(MySql5.7實(shí)測(cè),與IEEE標(biāo)準(zhǔn)計(jì)算的實(shí)際是不同的,下面介紹):M取值范圍為0~255。FLOAT只保證6位有效數(shù)字的準(zhǔn)確性,所以FLOAT(M,D)中,M=6時(shí),數(shù)字通常是準(zhǔn)確的。如果M和D都有明確定義,其超出范圍后的處理同decimal。
D取值范圍為0~30,同時(shí)必須=M。double只保證16位有效數(shù)字的準(zhǔn)確性,所以DOUBLE(M,D)中,M=16時(shí),數(shù)字通常是準(zhǔn)確的。如果M和D都有明確定義,其超出范圍后的處理同decimal。
CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉,所以,我們?cè)诖鎯?chǔ)時(shí)字符串右邊不能有空格,即使有,查詢出來(lái)后也會(huì)被刪除。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫(xiě)轉(zhuǎn)換。
三、時(shí)間日期類(lèi)型(5)
該“0”值如下:
請(qǐng)點(diǎn)擊輸入圖片描述
四、各種類(lèi)型占用的存儲(chǔ)
1.數(shù)值類(lèi)型
請(qǐng)點(diǎn)擊輸入圖片描述
定點(diǎn)數(shù)的比較特殊,而且與具體版本也有關(guān)系,此處單獨(dú)解釋:
使用二進(jìn)制格式將9個(gè)十進(jìn)制(基于10)數(shù)壓縮為4個(gè)字節(jié)來(lái)表示DECIMAL列值。每個(gè)值的整數(shù)和分?jǐn)?shù)部分的存儲(chǔ)分別確定。每個(gè)9位數(shù)的倍數(shù)需要4個(gè)字節(jié),并且“剩余的”位需要4個(gè)字節(jié)的一部分。下表給出了超出位數(shù)的存儲(chǔ)需求:
請(qǐng)點(diǎn)擊輸入圖片描述
2.時(shí)間日期
請(qǐng)點(diǎn)擊輸入圖片描述
從版本5.6.4開(kāi)始,存儲(chǔ)需求就有所改變,根據(jù)精度而定。不確定部分需要的存儲(chǔ)如下:
請(qǐng)點(diǎn)擊輸入圖片描述
比如,TIME(0), TIME(2), TIME(4), 和TIME(6) 分別使用3, 4, 5, 6 bytes?!?/p>
3.字符串
請(qǐng)點(diǎn)擊輸入圖片描述
4.類(lèi)型的選擇
為了優(yōu)化存儲(chǔ),在任何情況下均應(yīng)使用最精確的類(lèi)型。
例如,如果列的值的范圍為從1到99999,若使用整數(shù),則MEDIUMINT UNSIGNED是好的類(lèi)型。在所有可以表示該列值的類(lèi)型中,該類(lèi)型使用的存儲(chǔ)最少。
用精度為65位十進(jìn)制數(shù)(基于10)對(duì)DECIMAL 列進(jìn)行所有基本計(jì)算(+、-、*、/)。
使用雙精度操作對(duì)DECIMAL值進(jìn)行計(jì)算。如果準(zhǔn)確度不是太重要或如果速度為最高優(yōu)先級(jí),DOUBLE類(lèi)型即足夠了。為了達(dá)到高精度,可以轉(zhuǎn)換到保存在BIGINT中的定點(diǎn)類(lèi)型。這樣可以用64位整數(shù)進(jìn)行所有計(jì)算,根據(jù)需要將結(jié)果轉(zhuǎn)換回浮點(diǎn)值。
5.使用其他數(shù)據(jù)庫(kù)的SQL語(yǔ)句
為了使用為其它數(shù)據(jù)庫(kù)編寫(xiě)的SQL執(zhí)行代碼,MySQL按照下表所示對(duì)列類(lèi)型進(jìn)行映射。通過(guò)這些映射,可以很容易地從其它數(shù)據(jù)庫(kù)引擎將表定義導(dǎo)入到MySQL中:
請(qǐng)點(diǎn)擊輸入圖片描述
一、修改表
二、復(fù)制表
三、表字段的數(shù)據(jù)類(lèi)型
存儲(chǔ)引擎決定了表的類(lèi)型,而表內(nèi)存放的數(shù)據(jù)也要有不同的類(lèi)型,每種數(shù)據(jù)類(lèi)型都有自己的寬度,但寬度是可選的。
mysql常用數(shù)據(jù)類(lèi)型有:
數(shù)值類(lèi)型
1、整數(shù)類(lèi)型
TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:存儲(chǔ)年齡,等級(jí),id,各種號(hào)碼等
注意:為該類(lèi)型指定寬度時(shí),僅僅只是指定查詢結(jié)果的顯示寬度,與存儲(chǔ)范圍無(wú)關(guān),存儲(chǔ)范圍如下
其實(shí)我們完全沒(méi)必要為整數(shù)類(lèi)型指定顯示寬度,使用默認(rèn)的就可以了
默認(rèn)的顯示寬度,都是在最大值的基礎(chǔ)上加1
2、浮點(diǎn)型
定點(diǎn)數(shù)類(lèi)型 DEC等同于DECIMAL
浮點(diǎn)類(lèi)型:FLOAT DOUBLE
作用:存儲(chǔ)薪資、身高、體重、體質(zhì)參數(shù)等
3、日期類(lèi)型
DATE TIME DATETIME TIMESTAMP YEAR
作用:存儲(chǔ)用戶注冊(cè)時(shí)間,文章發(fā)布時(shí)間,員工入職時(shí)間,出生時(shí)間,過(guò)期時(shí)間等
datatime與timestamp的區(qū)別
4、字符串類(lèi)型
總結(jié):
單從數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)機(jī)制去考慮,char數(shù)據(jù)類(lèi)型的處理速度更快,有時(shí)甚至可以超出varchar處理速度的50%。
但對(duì)于InnoDB數(shù)據(jù)表,內(nèi)部的行存儲(chǔ)格式?jīng)]有區(qū)分固定長(zhǎng)度和可變長(zhǎng)度列(所有數(shù)據(jù)行都使用指向數(shù)據(jù)列值的頭指針),因此在本質(zhì)上,使用固定長(zhǎng)度的CHAR列不一定比使用可變長(zhǎng)度VARCHAR列性能要好。因而,主要的性能因素是數(shù)據(jù)行使用的存儲(chǔ)總量。由于CHAR平均占用的空間多于VARCHAR,因此使用VARCHAR來(lái)最小化需要處理的數(shù)據(jù)行的存儲(chǔ)總量和磁盤(pán)I/O是比較好的。
5、枚舉類(lèi)型和集合類(lèi)型
字段的值只能在給定范圍中選擇,如單選框,多選框
enum 單選 只能在給定的范圍內(nèi)選一個(gè)值,如性別 sex 男male/女female
set 多選 在給定的范圍內(nèi)可以選擇一個(gè)或一個(gè)以上的值(愛(ài)好1,愛(ài)好2,愛(ài)好3...)
網(wǎng)站題目:mysql怎么選數(shù)據(jù)類(lèi)型,mysql怎么選擇數(shù)據(jù)庫(kù)
網(wǎng)站URL:http://jinyejixie.com/article20/dsecsjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、服務(wù)器托管、定制網(wǎng)站、靜態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容