Fraction+mysql_MySQL 数据类型总结
MySQL 支持多種類型的 SQL 數據類型:數字類型,日期和時間類型,字符串(字符和字節)類型,空間類型和 JSON 數據類型。
1. 數字類型
MySQL 的數字類型包括: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
在建表時,經常有類似的操作 int(10),這里我用 int(M)來表示,請注意:
(1) 不管 M 多大,int 型永遠占 4 字節的存儲空間
(2) M 表示顯示寬度,不足的用 0 補齊,但是必須設置 UNSIGNED ZEROFILL 屬性才能生效,超出指定長度時直接顯示整個數字
對于上面的第二點,舉例說明
-- 創建學生表drop table if exists student;
create table student(
stu_id int(6) unsigned zerofill primary key comment '學號',
stu_name char(20) comment '學生姓名',
stu_age tinyint unsigned comment '學生年齡',
stu_sex tinyint unsigned comment '學生性別:0-女,1-男',
address varchar(64) comment '家庭住址',
create_date datetime comment '創建時間',
status_date datetime comment '修改時間'
)comment '學生表';
-- 插入兩條記錄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());
上面創建了一張 student 表,并插入一條記錄,我們執行查詢語句看下這條記錄,如下所示;
可以看到,第一條結果 stu_id 顯示為 000001,前面 5 位用 0 補齊;第二條 stu_id 顯示為 12345678
1.2 浮點類型 FLOAT 和 DOUBLE
類型
存儲 (Bytes)
說明
FLOAT
4
單精度
DOUBLE
8
雙精度
對于浮點類型,聲明形式為 float(M,D)和 double(M,D),其中 M 表示總位數,D 表示小數位數,如果小數部分超出 D 位,則進行四舍五入處理。例如 float(5,2),表示整數部分占三位,小數部分占兩位。
1.3 定點類型 Decimal
浮點類型 FLOAT 和 DOUBLE 會出現丟失精度的問題,而 Decimal 不會。Decimal 聲明形式為 decimal(M,N),其中 M 表示總位數,N 表示小數位數(和浮點類型類似)。
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 是可選的,表示微秒位數,取值范圍是 0~6,不指定則默認為 0(不顯示微秒)。
3. 字符串類型 char 和 varchar
char 和 varchar 使用頻率很高,總結如下
(1)char 表示固定長度的字符串,如果存入的字符長度不足 n 位,前面使用空格補齊,char 類型取值范圍是 0~255;
(2)varchar 表示可變長度的字符串,取值范圍是 0~65535,注意:實際最大長度取決于編碼格式;
(3)char 類型占用的存儲空間是保存字符所需要的字節數,而 varchar 類型占用的存儲空間除了保存字符需要的字節數外,還要額外占用 1~2 個字節的空間(因為對于 varchar 類型,除了存儲要保存的字符外,還需要存儲字符長度,當字符長度不超過 255 時,則使用 1 個字節,當字符長度超過 255 時,則使用 2 個字節);
(4)char 類型檢索速度快于 varchar 類型;
(5)對于 char 類型,MySQL 會過濾尾部的空格,而 varchar 類型不會。
在實際使用中,如何確定使用 char 還是 varchar 呢,這里有一個參考標準:當你能大概確定保存的字符長度時,使用 char 是一個不錯的選擇;當你不能確定要保存的字符串長度時,使用 varchar,來達到節省空間的目的。
4. 對 varchar 類型保存的最大字符長度探究
在探討這個問題之前,先說明幾條 mysql 中的規范:
(1)MySQL 表的內部表示的最大行大小限制為 65,535 字節
(2)對于 varchar 類型,除了存儲要保存的字符外,還需要存儲字符長度,當字符長度不超過 255 時,則使用 1 個字節,當字符長度超過 255 時,則使用 2 個字節
(3)對于 varchar 類型,需要使用一個字節來表示該字段是否為 null
(1)看下面一段 sql
create table test_varchar(
int_value int,
varchar_value varchar(65535)
)engine=innodb charset=utf8;
執行這段 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;
很不幸,執行這段 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;
就可以成功執行了。
那么 21844 是怎么來的呢?首先,根據上面說的(2)、(3)兩條規范,我們需要減去 2 個字節用于保存字符串長度,還需要減去一個字節,用來表示該字段是否為空;然后,對于 utf-8 編碼需要 3 個字節來表示一個漢字;最后(65535-2-1)/3=21844
如果你把編碼格式修改成 gbk,那么最大字符長度=(65535-2-1)/2=32766,除 2 是因為 gbk 編碼使用 2 個字節來表示一個漢字。
但是,別忘了我們的第(1)條規范,單行長度不能超過 65535 字節,所以如果我們增加一個 int 字段,sql 如下:
create table test_varchar(
int_value int,
varchar_value varchar(21844)
)engine=innodb charset=utf8;
執行這段 sql,你仍然會得到以 1118 開頭的錯誤碼,原因就是超出了 MySQL 的單行長度限制。
總結
以上是生活随笔為你收集整理的Fraction+mysql_MySQL 数据类型总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cnetos6.2搭建mysql_基于腾
- 下一篇: MySQL的原理以及流程_MySQL的复