日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Fraction+mysql_MySQL 数据类型总结

發(fā)布時間:2024/4/18 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Fraction+mysql_MySQL 数据类型总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。