Fraction+mysql_MySQL 数据类型总结
MySQL 支持多種類型的 SQL 數(shù)據(jù)類型:數(shù)字類型,日期和時間類型,字符串(字符和字節(jié))類型,空間類型和 JSON 數(shù)據(jù)類型。
1. 數(shù)字類型
MySQL 的數(shù)字類型包括:Integer Types(整型)、Fixed-Point Types(定點類型)、Floating-Point Types (浮點類型)、Bit-Value(比特值型)等。
1.1 整型
類型
存儲 (Bytes)
范圍(有符號)
范圍(無符號)
TINYINT
1
-128,127
0,255
SMALLINT
2
-32768,32767
0,65535
MEDIUMINT
3
-8388608,8388607
0,16777215
INT
4
-2147483648,2147483647
0,4294967295
BIGINT
8
-2^63,2^63-1
0,2^64-1
在建表時,經(jīng)常有類似的操作 int(10),這里我用 int(M)來表示,請注意:
(1) 不管 M 多大,int 型永遠(yuǎn)占 4 字節(jié)的存儲空間
(2) M 表示顯示寬度,不足的用 0 補(bǔ)齊,但是必須設(shè)置 UNSIGNED ZEROFILL 屬性才能生效,超出指定長度時直接顯示整個數(shù)字
對于上面的第二點,舉例說明
-- 創(chuàng)建學(xué)生表drop table if exists student;
create table student(
stu_id int(6) unsigned zerofill primary key comment '學(xué)號',
stu_name char(20) comment '學(xué)生姓名',
stu_age tinyint unsigned comment '學(xué)生年齡',
stu_sex tinyint unsigned comment '學(xué)生性別:0-女,1-男',
address varchar(64) comment '家庭住址',
create_date datetime comment '創(chuàng)建時間',
status_date datetime comment '修改時間'
)comment '學(xué)生表';
-- 插入兩條記錄insert into student(stu_name,stu_age,stu_sex,address,create_date,status_date) values('tom',20,1,'shanghai',now(),now());
insert into student(stu_id,stu_name,stu_age,stu_sex,address,create_date,status_date) values(12345678,'jerry',21,1,'shanghai',now(),now());
上面創(chuàng)建了一張 student 表,并插入一條記錄,我們執(zhí)行查詢語句看下這條記錄,如下所示;
可以看到,第一條結(jié)果 stu_id 顯示為 000001,前面 5 位用 0 補(bǔ)齊;第二條 stu_id 顯示為 12345678
1.2 浮點類型 FLOAT 和 DOUBLE
類型
存儲 (Bytes)
說明
FLOAT
4
單精度
DOUBLE
8
雙精度
對于浮點類型,聲明形式為 float(M,D)和 double(M,D),其中 M 表示總位數(shù),D 表示小數(shù)位數(shù),如果小數(shù)部分超出 D 位,則進(jìn)行四舍五入處理。例如 float(5,2),表示整數(shù)部分占三位,小數(shù)部分占兩位。
1.3 定點類型 Decimal
浮點類型 FLOAT 和 DOUBLE 會出現(xiàn)丟失精度的問題,而 Decimal 不會。Decimal 聲明形式為 decimal(M,N),其中 M 表示總位數(shù),N 表示小數(shù)位數(shù)(和浮點類型類似)。
2. 日期和時間類型
類型
存儲 (Bytes)
范圍
格式
DATE
3
1000-01-01,9999-12-31
YYYY-MM-DD
TIME[fsp]
3
-838:59:59.000000,838:59:59.0000007
hh:mm:ss[.fraction]
YEAR
1
1901,2155
YYYY
DATETIME[fsp]
8
1000-01-01 00:00:00.000000,9999-12-31 23:59:59.999999
YYYY-MM-DD hh:mm:ss[.fraction]
TIMESTAMP[fsp]
4
1970-01-01 00:00:01.000000,2038-01-19 03:14:07.999999
YYYY-MM-DD hh:mm:ss[.fraction]
注意 fsp 是可選的,表示微秒位數(shù),取值范圍是 0~6,不指定則默認(rèn)為 0(不顯示微秒)。
3. 字符串類型 char 和 varchar
char 和 varchar 使用頻率很高,總結(jié)如下
(1)char 表示固定長度的字符串,如果存入的字符長度不足 n 位,前面使用空格補(bǔ)齊,char 類型取值范圍是 0~255;
(2)varchar 表示可變長度的字符串,取值范圍是 0~65535,注意:實際最大長度取決于編碼格式;
(3)char 類型占用的存儲空間是保存字符所需要的字節(jié)數(shù),而 varchar 類型占用的存儲空間除了保存字符需要的字節(jié)數(shù)外,還要額外占用 1~2 個字節(jié)的空間(因為對于 varchar 類型,除了存儲要保存的字符外,還需要存儲字符長度,當(dāng)字符長度不超過 255 時,則使用 1 個字節(jié),當(dāng)字符長度超過 255 時,則使用 2 個字節(jié));
(4)char 類型檢索速度快于 varchar 類型;
(5)對于 char 類型,MySQL 會過濾尾部的空格,而 varchar 類型不會。
在實際使用中,如何確定使用 char 還是 varchar 呢,這里有一個參考標(biāo)準(zhǔn):當(dāng)你能大概確定保存的字符長度時,使用 char 是一個不錯的選擇;當(dāng)你不能確定要保存的字符串長度時,使用 varchar,來達(dá)到節(jié)省空間的目的。
4. 對 varchar 類型保存的最大字符長度探究
在探討這個問題之前,先說明幾條 mysql 中的規(guī)范:
(1)MySQL 表的內(nèi)部表示的最大行大小限制為 65,535 字節(jié)
(2)對于 varchar 類型,除了存儲要保存的字符外,還需要存儲字符長度,當(dāng)字符長度不超過 255 時,則使用 1 個字節(jié),當(dāng)字符長度超過 255 時,則使用 2 個字節(jié)
(3)對于 varchar 類型,需要使用一個字節(jié)來表示該字段是否為 null
(1)看下面一段 sql
create table test_varchar(
int_value int,
varchar_value varchar(65535)
)engine=innodb charset=utf8;
執(zhí)行這段 sql,會看到這樣的錯誤提示
1074 - Column length too big for column 'varchar_value' (max = 21845); use BLOB or TEXT instead
那么我們來修改一下 sql
create table test_varchar(
int_value int,
varchar_value varchar(21845)
)engine=innodb charset=utf8;
很不幸,執(zhí)行這段 sql,仍然會提示我們錯誤:
1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
最后,我們把 sql 修改成這樣:
create table test_varchar(
varchar_value varchar(21844)
)engine=innodb charset=utf8;
就可以成功執(zhí)行了。
那么 21844 是怎么來的呢?首先,根據(jù)上面說的(2)、(3)兩條規(guī)范,我們需要減去 2 個字節(jié)用于保存字符串長度,還需要減去一個字節(jié),用來表示該字段是否為空;然后,對于 utf-8 編碼需要 3 個字節(jié)來表示一個漢字;最后(65535-2-1)/3=21844
如果你把編碼格式修改成 gbk,那么最大字符長度=(65535-2-1)/2=32766,除 2 是因為 gbk 編碼使用 2 個字節(jié)來表示一個漢字。
但是,別忘了我們的第(1)條規(guī)范,單行長度不能超過 65535 字節(jié),所以如果我們增加一個 int 字段,sql 如下:
create table test_varchar(
int_value int,
varchar_value varchar(21844)
)engine=innodb charset=utf8;
執(zhí)行這段 sql,你仍然會得到以 1118 開頭的錯誤碼,原因就是超出了 MySQL 的單行長度限制。
總結(jié)
以上是生活随笔為你收集整理的Fraction+mysql_MySQL 数据类型总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cnetos6.2搭建mysql_基于腾
- 下一篇: linux cmake编译源码,linu