Mysql數(shù)據(jù)類型
類型 ---------------------------類型舉例
整數(shù)類型 TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT
浮點(diǎn)類型 FLOAT、DOUBLE
定點(diǎn)數(shù)類型 DECIMAL
位類型 BIT
日期時(shí)間類型 YEAR、TIME、DATE、DATETIME、TIMESTAMP
文本字符串類型 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
枚舉類型 ENUM
集合類型 SET
二進(jìn)制字符串類
型 BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB JSON類型 JSON對(duì)象、JSON數(shù)組
空間數(shù)據(jù)類型
單值類型:GEOMETRY、POINT、LINESTRING、POLYGON;
集合類型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、 GEOMETRYCOLLECTION
常見數(shù)據(jù)類型的屬性,如下:
MySQL關(guān)鍵字 含義
NULL 數(shù)據(jù)列可包含NULL值 NOT NULL 數(shù)據(jù)列不允許包含NULL值 DEFAULT 默認(rèn)值
PRIMARY KEY 主鍵
AUTO_INCREMENT 自動(dòng)遞增,適用于整數(shù)類型
UNSIGNED 無(wú)符號(hào)
CHARACTER SET name 指定一個(gè)字符集
類型介紹
-
整數(shù)類型
整數(shù)類型一共有 5 種,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。
它們的區(qū)別如下表所示:
image.png
TINYINT :一般用于枚舉數(shù)據(jù),比如系統(tǒng)設(shè)定取值范圍很小且固定的場(chǎng)景。
SMALLINT :可以用于較小范圍的統(tǒng)計(jì)數(shù)據(jù),比如統(tǒng)計(jì)工廠的固定資產(chǎn)庫(kù)存數(shù)量等。
MEDIUMINT :用于較大整數(shù)的計(jì)算,比如車站每日的客流量等。
INT、INTEGER :取值范圍足夠大,一般情況下不用考慮超限問(wèn)題,用得最多。比如商品編號(hào)。
BIGINT :只有當(dāng)你處理特別巨大的整數(shù)時(shí)才會(huì)用到。比如雙十一的交易量、大型門戶網(wǎng)站點(diǎn)擊量、證券公司衍生產(chǎn)品持倉(cāng)等。
如何選擇?
在評(píng)估用哪種整數(shù)類型的時(shí)候,你需要考慮 存儲(chǔ)空間 和 可靠性 的平衡問(wèn)題:一方 面,用占用字節(jié)數(shù)少的整數(shù)類型可以節(jié)省存儲(chǔ)空間;另一方面,要是為了節(jié)省存儲(chǔ)空間, 使用的整數(shù)類型取值范圍太小,一旦遇到超出取值范圍的情況,就可能引起 系統(tǒng)錯(cuò)誤 ,影響可靠性。舉個(gè)例子,商品編號(hào)采用的數(shù)據(jù)類型是 INT。原因就在于,客戶門店中流通的商品種類較多,而且,每天都有商品下架,新商品上架,這樣不斷迭代,日積月累。如果使用 SMALLINT 類型,雖然占用字節(jié)數(shù)比 INT 類型的整數(shù)少,但是卻不能保證數(shù)據(jù)不會(huì)超出范圍65535。相反,使用 INT,就能確保有足夠大的取值范圍,不用擔(dān)心數(shù)據(jù)超出范圍影響可靠性的問(wèn)題。你要注意的是,在實(shí)際工作中,系統(tǒng)故障產(chǎn)生的成本遠(yuǎn)遠(yuǎn)超過(guò)增加幾個(gè)字段存儲(chǔ)空間所產(chǎn)生的成本。因此,我建議你首先確保數(shù)據(jù)不會(huì)超過(guò)取值范圍,在這個(gè)前提之下,再去考慮如何節(jié)省存儲(chǔ)空間。 -
浮點(diǎn)類型
浮點(diǎn)數(shù)和定點(diǎn)數(shù)類型的特點(diǎn)是可以 處理小數(shù) ,你可以把整數(shù)看成小數(shù)的一個(gè)特例。因此,浮點(diǎn)數(shù)和定點(diǎn)
數(shù)的使用場(chǎng)景,比整數(shù)大多了。 MySQL支持的浮點(diǎn)數(shù)類型,分別是 FLOAT、DOUBLE、REAL。
FLOAT 表示單精度浮點(diǎn)數(shù);
DOUBLE 表示雙精度浮點(diǎn)數(shù);
image.png
數(shù)據(jù)精度說(shuō)明
對(duì)于浮點(diǎn)類型,在MySQL中單精度值使用 4 個(gè)字節(jié),雙精度值使用 8 個(gè)字節(jié)。
MySQL允許使用 非標(biāo)準(zhǔn)語(yǔ)法 (其他數(shù)據(jù)庫(kù)未必支持,因此如果涉及到數(shù)據(jù)遷移,則最好不要這么
用): FLOAT(M,D) 或 DOUBLE(M,D) 。這里,M稱為 精度 ,D稱為 標(biāo)度 。(M,D)中 M=整數(shù)位+小數(shù)
位,D=小數(shù)位。 D<=M<=255,0<=D<=30。
例如,定義為FLOAT(5,2)的一個(gè)列可以顯示為-999.99-999.99。如果超過(guò)這個(gè)范圍會(huì)報(bào)錯(cuò)。
FLOAT和DOUBLE類型在不指定(M,D)時(shí),默認(rèn)會(huì)按照實(shí)際的精度(由實(shí)際的硬件和操作系統(tǒng)決定)
來(lái)顯示。
說(shuō)明:浮點(diǎn)類型,也可以加 UNSIGNED ,但是不會(huì)改變數(shù)據(jù)范圍,例如:FLOAT(3,2) UNSIGNED仍然
只能表示0-9.99的范圍。
不管是否顯式設(shè)置了精度(M,D),這里MySQL的處理方案如下:
如果存儲(chǔ)時(shí),整數(shù)部分超出了范圍,MySQL就會(huì)報(bào)錯(cuò),不允許存這樣的值
如果存儲(chǔ)時(shí),小數(shù)點(diǎn)部分若超出范圍,就分以下情況:
若四舍五入后,整數(shù)部分沒(méi)有超出范圍,則只警告,但能成功操作并四舍五入刪除多余
的小數(shù)位后保存。例如在FLOAT(5,2)列內(nèi)插入999.009,近似結(jié)果是999.01。
若四舍五入后,整數(shù)部分超出范圍,則MySQL報(bào)錯(cuò),并拒絕處理。如FLOAT(5,2)列內(nèi)插入
999.995和-999.995都會(huì)報(bào)錯(cuò)。
從MySQL 8.0.17開始,F(xiàn)LOAT(M,D) 和DOUBLE(M,D)用法在官方文檔中已經(jīng)明確不推薦使用,將來(lái)可
能被移除。另外,關(guān)于浮點(diǎn)型FLOAT和DOUBLE的UNSIGNED也不推薦使用了,將來(lái)也可能被移除。
在編程中,如果用到浮點(diǎn)數(shù),要特別注意誤差問(wèn)題,因?yàn)楦↑c(diǎn)數(shù)是不準(zhǔn)確的,所以我們要避免使用“=”來(lái)
判斷兩個(gè)數(shù)是否相等。同時(shí),在一些對(duì)精確度要求較高的項(xiàng)目中,千萬(wàn)不要使用浮點(diǎn)數(shù),不然會(huì)導(dǎo)致結(jié)
果錯(cuò)誤,甚至是造成不可挽回的損失。那么,MySQL 有沒(méi)有精準(zhǔn)的數(shù)據(jù)類型呢?當(dāng)然有,這就是定點(diǎn)數(shù)
類型: DECIMAL 。 -
定點(diǎn)數(shù)據(jù)類型
MySQL中的定點(diǎn)數(shù)類型只有 DECIMAL 一種類型。
image.png
使用 DECIMAL(M,D) 的方式表示高精度小數(shù)。其中,M被稱為精度,D被稱為標(biāo)度。0<=M<=65, 0<=D<=30,D<M。例如,定義DECIMAL(5,2)的類型,表示該列取值范圍是-999.99~999.99。
DECIMAL(M,D)的最大取值范圍與DOUBLE類型一樣,但是有效的數(shù)據(jù)范圍是由M和D決定的。
DECIMAL 的存儲(chǔ)空間并不是固定的,由精度值M決定,總共占用的存儲(chǔ)空間為M+2個(gè)字節(jié)。也就是
說(shuō),在一些對(duì)精度要求不高的場(chǎng)景下,比起占用同樣字節(jié)長(zhǎng)度的定點(diǎn)數(shù),浮點(diǎn)數(shù)表達(dá)的數(shù)值范圍可
以更大一些。
定點(diǎn)數(shù)在MySQL內(nèi)部是以 字符串 的形式進(jìn)行存儲(chǔ),這就決定了它一定是精準(zhǔn)的。
當(dāng)DECIMAL類型不指定精度和標(biāo)度時(shí),其默認(rèn)為DECIMAL(10,0)。當(dāng)數(shù)據(jù)的精度超出了定點(diǎn)數(shù)類型的
精度范圍時(shí),則MySQL同樣會(huì)進(jìn)行四舍五入處理。
浮點(diǎn)數(shù) vs 定點(diǎn)數(shù)
浮點(diǎn)數(shù)相對(duì)于定點(diǎn)數(shù)的優(yōu)點(diǎn)是在長(zhǎng)度一定的情況下,浮點(diǎn)類型取值范圍大,但是不精準(zhǔn),適用
于需要取值范圍大,又可以容忍微小誤差的科學(xué)計(jì)算場(chǎng)景(比如計(jì)算化學(xué)、分子建模、流體動(dòng)
力學(xué)等)
定點(diǎn)數(shù)類型取值范圍相對(duì)小,但是精準(zhǔn),沒(méi)有誤差,適合于對(duì)精度要求極高的場(chǎng)景 (比如涉
及金額計(jì)算的場(chǎng)景) -
位類型:BIT
image.png - 日期與時(shí)間類型
日期與時(shí)間是重要的信息,在我們的系統(tǒng)中,幾乎所有的數(shù)據(jù)表都用得到。原因是客戶需要知道數(shù)據(jù)的
時(shí)間標(biāo)簽,從而進(jìn)行數(shù)據(jù)查詢、統(tǒng)計(jì)和處理。
MySQL有多種表示日期和時(shí)間的數(shù)據(jù)類型,不同的版本可能有所差異,MySQL8.0版本支持的日期和時(shí)間
類型主要有:YEAR類型、TIME類型、DATE類型、DATETIME類型和TIMESTAMP類型。
YEAR 類型通常用來(lái)表示年
DATE 類型通常用來(lái)表示年、月、日
TIME 類型通常用來(lái)表示時(shí)、分、秒
DATETIME 類型通常用來(lái)表示年、月、日、時(shí)、分、秒
TIMESTAMP 類型通常用來(lái)表示帶時(shí)區(qū)的年、月、日、時(shí)、分、秒
用得最多的日期時(shí)間類型,就是 DATETIME 。雖然 MySQL 也支持 YEAR(年)、 TIME(時(shí)間)、
DATE(日期),以及 TIMESTAMP 類型,但是在實(shí)際項(xiàng)目中,盡量用 DATETIME 類型。因?yàn)檫@個(gè)數(shù)據(jù)類型
包括了完整的日期和時(shí)間信息,取值范圍也最大,使用起來(lái)比較方便。畢竟,如果日期時(shí)間信息分散在
好幾個(gè)字段,很不容易記,而且查詢的時(shí)候,SQL 語(yǔ)句也會(huì)更加復(fù)雜。
此外,一般存注冊(cè)時(shí)間、商品發(fā)布時(shí)間等,不建議使用DATETIME存儲(chǔ),而是使用 時(shí)間戳 ,因?yàn)?br> DATETIME雖然直觀,但不便于計(jì)算 -
文本類型
MySQL中,文本字符串總體上分為 CHAR 、 VARCHAR 、 TINYTEXT 、 TEXT 、 MEDIUMTEXT 、 LONGTEXT 、 ENUM 、 SET 等類型。
image.png
-
CHAR與VARCHAR類型
CHAR和VARCHAR類型都可以存儲(chǔ)比較短的字符串。
image.png
CHAR類型:
CHAR(M) 類型一般需要預(yù)先定義字符串長(zhǎng)度。如果不指定(M),則表示長(zhǎng)度默認(rèn)是1個(gè)字符。
如果保存時(shí),數(shù)據(jù)的實(shí)際長(zhǎng)度比CHAR類型聲明的長(zhǎng)度小,則會(huì)在 右側(cè)填充 空格以達(dá)到指定的長(zhǎng)
度。當(dāng)MySQL檢索CHAR類型的數(shù)據(jù)時(shí),CHAR類型的字段會(huì)去除尾部的空格。
定義CHAR類型字段時(shí),聲明的字段長(zhǎng)度即為CHAR類型字段所占的存儲(chǔ)空間的字節(jié)數(shù)。
VARCHAR類型:
VARCHAR(M) 定義時(shí), 必須指定 長(zhǎng)度M,否則報(bào)錯(cuò)。
MySQL4.0版本以下,varchar(20):指的是20字節(jié),如果存放UTF8漢字時(shí),只能存6個(gè)(每個(gè)漢字3字
節(jié)) ;MySQL5.0版本以上,varchar(20):指的是20字符。
檢索VARCHAR類型的字段數(shù)據(jù)時(shí),會(huì)保留數(shù)據(jù)尾部的空格。VARCHAR類型的字段所占用的存儲(chǔ)空間
為字符串實(shí)際長(zhǎng)度加1個(gè)字節(jié)。
哪些情況使用 CHAR 或 VARCHAR 更好
image.png
情況1:存儲(chǔ)很短的信息。比如門牌號(hào)碼101,201……這樣很短的信息應(yīng)該用char,因?yàn)関archar還要占個(gè)
byte用于存儲(chǔ)信息長(zhǎng)度,本來(lái)打算節(jié)約存儲(chǔ)的,結(jié)果得不償失。
情況3:十分頻繁改變的column。因?yàn)関archar每次存儲(chǔ)都要有額外的計(jì)算,得到長(zhǎng)度等工作,如果一個(gè)
非常頻繁改變的,那就要有很多的精力用于計(jì)算,而這些對(duì)于char來(lái)說(shuō)是不需要的。
情況4:具體存儲(chǔ)引擎中的情況:
MyISAM 數(shù)據(jù)存儲(chǔ)引擎和數(shù)據(jù)列:MyISAM數(shù)據(jù)表,最好使用固定長(zhǎng)度(CHAR)的數(shù)據(jù)列代替可變長(zhǎng)
度(VARCHAR)的數(shù)據(jù)列。這樣使得整個(gè)表靜態(tài)化,從而使 數(shù)據(jù)檢索更快 ,用空間換時(shí)間。
MEMORY 存儲(chǔ)引擎和數(shù)據(jù)列:MEMORY數(shù)據(jù)表目前都使用固定長(zhǎng)度的數(shù)據(jù)行存儲(chǔ),因此無(wú)論使用
CHAR或VARCHAR列都沒(méi)有關(guān)系,兩者都是作為CHAR類型處理的。
InnoDB 存儲(chǔ)引擎,建議使用VARCHAR類型。因?yàn)閷?duì)于InnoDB數(shù)據(jù)表,內(nèi)部的行存儲(chǔ)格式并沒(méi)有區(qū)
分固定長(zhǎng)度和可變長(zhǎng)度列(所有數(shù)據(jù)行都使用指向數(shù)據(jù)列值的頭指針),而且主要影響性能的因素
是數(shù)據(jù)行使用的存儲(chǔ)總量,由于char平均占用的空間多于varchar,所以除了簡(jiǎn)短并且固定長(zhǎng)度的,
其他考慮varchar。這樣節(jié)省空間,對(duì)磁盤I/O和數(shù)據(jù)存儲(chǔ)總量比較好。
-
TEXT類型
在MySQL中,TEXT用來(lái)保存文本類型的字符串,總共包含4種類型,分別為TINYTEXT、TEXT、 MEDIUMTEXT 和 LONGTEXT 類型。
在向TEXT類型的字段保存和查詢數(shù)據(jù)時(shí),系統(tǒng)自動(dòng)按照實(shí)際長(zhǎng)度存儲(chǔ),不需要預(yù)先定義長(zhǎng)度。這一點(diǎn)和
VARCHAR類型相同。
每種TEXT類型保存的數(shù)據(jù)長(zhǎng)度和所占用的存儲(chǔ)空間不同,如下:
image.png
由于實(shí)際存儲(chǔ)的長(zhǎng)度不確定,MySQL 不允許 TEXT 類型的字段做主鍵。遇到這種情況,你只能采用
CHAR(M),或者 VARCHAR(M)。
TEXT文本類型,可以存比較大的文本段,搜索速度稍慢,因此如果不是特別大的內(nèi)容,建議使用CHAR, VARCHAR來(lái)代替。還有TEXT類型不用加默認(rèn)值,加了也沒(méi)用。而且text和blob類型的數(shù)據(jù)刪除后容易導(dǎo)致
“空洞”,使得文件碎片比較多,所以頻繁使用的表不建議包含TEXT類型字段,建議單獨(dú)分出去,單獨(dú)用
一個(gè)表。 -
ENUM類型
ENUM類型也叫作枚舉類型,ENUM類型的取值范圍需要在定義字段時(shí)進(jìn)行指定。設(shè)置字段值時(shí),ENUM
類型只允許從成員中選取單個(gè)值,不能一次選取多個(gè)值。
其所需要的存儲(chǔ)空間由定義ENUM類型時(shí)指定的成員個(gè)數(shù)決定。
image.png
當(dāng)ENUM類型包含1~255個(gè)成員時(shí),需要1個(gè)字節(jié)的存儲(chǔ)空間;
當(dāng)ENUM類型包含256~65535個(gè)成員時(shí),需要2個(gè)字節(jié)的存儲(chǔ)空間。
ENUM類型的成員個(gè)數(shù)的上限為65535個(gè)。 -
SET類型
當(dāng)SET類型包含的成員個(gè)數(shù)不同時(shí),其所占用的存儲(chǔ)空間也是不同的,具體如下:
image.png
SET類型在存儲(chǔ)數(shù)據(jù)時(shí)成員個(gè)數(shù)越多,其占用的存儲(chǔ)空間越大。注意:SET類型在選取成員時(shí),可以一次
選擇多個(gè)成員,這一點(diǎn)與ENUM類型不同。 -
二進(jìn)制
MySQL中的二進(jìn)制字符串類型主要存儲(chǔ)一些二進(jìn)制數(shù)據(jù),比如可以存儲(chǔ)圖片、音頻和視頻等二進(jìn)制數(shù)
據(jù)。
MySQL中支持的二進(jìn)制字符串類型主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB類型。
BINARY與VARBINARY類型
BINARY和VARBINARY類似于CHAR和VARCHAR,只是它們存儲(chǔ)的是二進(jìn)制字符串。
BINARY (M)為固定長(zhǎng)度的二進(jìn)制字符串,M表示最多能存儲(chǔ)的字節(jié)數(shù),取值范圍是0~255個(gè)字符。如果未
指定(M),表示只能存儲(chǔ) 1個(gè)字節(jié) 。例如BINARY (8),表示最多能存儲(chǔ)8個(gè)字節(jié),如果字段值不足(M)個(gè)字
節(jié),將在右邊填充'\0'以補(bǔ)齊指定長(zhǎng)度。
VARBINARY (M)為可變長(zhǎng)度的二進(jìn)制字符串,M表示最多能存儲(chǔ)的字節(jié)數(shù),總字節(jié)數(shù)不能超過(guò)行的字節(jié)長(zhǎng)
度限制65535,另外還要考慮額外字節(jié)開銷,VARBINARY類型的數(shù)據(jù)除了存儲(chǔ)數(shù)據(jù)本身外,還需要1或2個(gè)
字節(jié)來(lái)存儲(chǔ)數(shù)據(jù)的字節(jié)數(shù)。VARBINARY類型 必須指定(M) ,否則報(bào)錯(cuò)。
image.png
BLOB是一個(gè) 二進(jìn)制大對(duì)象 ,可以容納可變數(shù)量的數(shù)據(jù)。
MySQL中的BLOB類型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB 4種類型,它們可容納值的最大
長(zhǎng)度不同??梢源鎯?chǔ)一個(gè)二進(jìn)制的大對(duì)象,比如 圖片 、 音頻 和 視頻 等。
需要注意的是,在實(shí)際工作中,往往不會(huì)在MySQL數(shù)據(jù)庫(kù)中使用BLOB類型存儲(chǔ)大對(duì)象數(shù)據(jù),通常會(huì)將圖
片、音頻和視頻文件存儲(chǔ)到 服務(wù)器的磁盤上 ,并將圖片、音頻和視頻的訪問(wèn)路徑存儲(chǔ)到MySQL中。
image.png
image.png
TEXT和BLOB的使用注意事項(xiàng):
在使用text和blob字段類型時(shí)要注意以下幾點(diǎn),以便更好的發(fā)揮數(shù)據(jù)庫(kù)的性能。
① BLOB和TEXT值也會(huì)引起自己的一些問(wèn)題,特別是執(zhí)行了大量的刪除或更新操作的時(shí)候。刪除這種值
會(huì)在數(shù)據(jù)表中留下很大的" 空洞 ",以后填入這些"空洞"的記錄可能長(zhǎng)度不同。為了提高性能,建議定期
使用 OPTIMIZE TABLE 功能對(duì)這類表進(jìn)行 碎片整理 。 ② 如果需要對(duì)大文本字段進(jìn)行模糊查詢,MySQL 提供了 前綴索引 。但是仍然要在不必要的時(shí)候避免檢
索大型的BLOB或TEXT值。例如,SELECT * 查詢就不是很好的想法,除非你能夠確定作為約束條件的
WHERE子句只會(huì)找到所需要的數(shù)據(jù)行。否則,你可能毫無(wú)目的地在網(wǎng)絡(luò)上傳輸大量的值。
③ 把BLOB或TEXT列 分離到單獨(dú)的表 中。在某些環(huán)境中,如果把這些數(shù)據(jù)列移動(dòng)到第二張數(shù)據(jù)表中,可
以讓你把原數(shù)據(jù)表中的數(shù)據(jù)列轉(zhuǎn)換為固定長(zhǎng)度的數(shù)據(jù)行格式,那么它就是有意義的。這會(huì) 減少主表中的 碎片 ,使你得到固定長(zhǎng)度數(shù)據(jù)行的性能優(yōu)勢(shì)。它還使你在主數(shù)據(jù)表上運(yùn)行 SELECT * 查詢的時(shí)候不會(huì)通過(guò)
網(wǎng)絡(luò)傳輸大量的BLOB或TEXT值。 - JSON 類型
JSON(JavaScript Object Notation)是一種輕量級(jí)的 數(shù)據(jù)交換格式 。簡(jiǎn)潔和清晰的層次結(jié)構(gòu)使得 JSON 成
為理想的數(shù)據(jù)交換語(yǔ)言。它易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效
率。JSON 可以將 JavaScript 對(duì)象中表示的一組數(shù)據(jù)轉(zhuǎn)換為字符串,然后就可以在網(wǎng)絡(luò)或者程序之間輕
松地傳遞這個(gè)字符串,并在需要的時(shí)候?qū)⑺€原為各編程語(yǔ)言所支持的數(shù)據(jù)格式。
在MySQL 5.7中,就已經(jīng)支持JSON數(shù)據(jù)類型。在MySQL 8.x版本中,JSON類型提供了可以進(jìn)行自動(dòng)驗(yàn)證的
JSON文檔和優(yōu)化的存儲(chǔ)結(jié)構(gòu),使得在MySQL中存儲(chǔ)和讀取JSON類型的數(shù)據(jù)更加方便和高效。 創(chuàng)建數(shù)據(jù)
表,表中包含一個(gè)JSON類型的字段 js 。 - 空間類型
MySQL 空間類型擴(kuò)展支持地理特征的生成、存儲(chǔ)和分析。這里的地理特征表示世界上具有位置的任何東
西,可以是一個(gè)實(shí)體,例如一座山;可以是空間,例如一座辦公樓;也可以是一個(gè)可定義的位置,例如
一個(gè)十字路口等等。MySQL中使用 Geometry(幾何) 來(lái)表示所有地理特征。Geometry指一個(gè)點(diǎn)或點(diǎn)的
集合,代表世界上任何具有位置的事物。
MySQL的空間數(shù)據(jù)類型(Spatial Data Type)對(duì)應(yīng)于OpenGIS類,包括單值類型:GEOMETRY、POINT、 LINESTRING、POLYGON以及集合類型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、 GEOMETRYCOLLECTION 。
Geometry是所有空間集合類型的基類,其他類型如POINT、LINESTRING、POLYGON都是Geometry的
子類。
Point,顧名思義就是點(diǎn),有一個(gè)坐標(biāo)值。例如POINT(121.213342 31.234532),POINT(30 10),
坐標(biāo)值支持DECIMAL類型,經(jīng)度(longitude)在前,維度(latitude)在后,用空格分隔。
LineString,線,由一系列點(diǎn)連接而成。如果線從頭至尾沒(méi)有交叉,那就是簡(jiǎn)單的
(simple);如果起點(diǎn)和終點(diǎn)重疊,那就是封閉的(closed)。例如LINESTRING(30 10,10 30,40 40),點(diǎn)與點(diǎn)之間用逗號(hào)分隔,一個(gè)點(diǎn)中的經(jīng)緯度用空格分隔,與POINT格式一致。
小結(jié)及選擇建議
任何字段如果為非負(fù)數(shù),必須是 UNSIGNED 【 強(qiáng)制 】小數(shù)類型為 DECIMAL,禁止使用 FLOAT 和 DOUBLE。
說(shuō)明:在存儲(chǔ)的時(shí)候,F(xiàn)LOAT 和 DOUBLE 都存在精度損失的問(wèn)題,很可能在比較值的時(shí)候,得
到不正確的結(jié)果。如果存儲(chǔ)的數(shù)據(jù)范圍超過(guò) DECIMAL 的范圍,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)并
分開存儲(chǔ)。
【 強(qiáng)制 】如果存儲(chǔ)的字符串長(zhǎng)度幾乎相等,使用 CHAR 定長(zhǎng)字符串類型。
【 強(qiáng)制 】VARCHAR 是可變長(zhǎng)字符串,不預(yù)先分配存儲(chǔ)空間,長(zhǎng)度不要超過(guò) 5000。如果存儲(chǔ)長(zhǎng)度大
于此值,定義字段類型為 TEXT,獨(dú)立出來(lái)一張表,用主鍵來(lái)對(duì)應(yīng),避免影響其它字段索引效率。












