MySQL 中的數據類型
類型 | 類型舉例 |
整數類型 | TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT |
浮點類型 | FLOAT、DOUBLE |
定點數類型 | DECIMAL |
位類型 | BIT |
日期時間類型 | YEAR、TIME、DATE、DATETIME、TIMESTAMP |
文本字符串類型 | CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT |
枚舉類型 | ENUM |
集合類型 | SET |
二進制字符串類型 | BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB |
JSON 類型 | JSON 對象、JSON 數組 |
空間數據類型 | 單值類型:GEOMETRY、POINT、LINESTRING、POLYGON 集合類型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION |
常見數據類型的屬性
MySQL 關鍵字 | 含義 |
NULL | 數據列可包含 NULL 值 |
NOT NULL | 數據列不允許包含 NULL 值 |
DEFAULT | 默認值 |
PRIMARY KEY | 主鍵 |
AUTO_INCREMENT | 自動遞增,適用於整數類型 |
UNSIGNED | 無符號 |
CHARACTER SET name | 指定一個字符集 |
整數類型
類型 | 占用空間(byte) | 帶符號 | 無符號 |
TINYINT | 1 | -27 ~ 27 - 1 | 0 ~ 28 - 1 |
SMALLINT | 2 | -215 ~ 215 - 1 | 0 ~ 216 - 1 |
MEDIUMINT | 3 | -223 ~ 223 - 1 | 0 ~ 224 - 1 |
INT(INTEGER) | 4 | -231 ~ 231 - 1 | 0 ~ 232 - 1 |
BIGINT | 8 | -263 ~ 263 - 1 | 0 ~ 264 - 1 |
(1)默認帶符號,定義無符號,在類型后加上 UNSIGNED
(2)使用規范:滿足需求情況下,盡量選擇字節占用空間小的類型
1、可選類型
(1)M
(2)UNSIGNED
(3)ZEROFILL
2、M
(1)可選類型
(2)表示顯示寬度,取值范圍:(0, 255),如:int(5):當數據寬度小於 5 位的時候在數字前面需要用字符填滿寬度
(3)該項功能需要配合 ZEROFILL 使用,表示用 0 填滿寬度,否則指定顯示寬度無效
(4)如果設置顯示寬度,插入的數據寬度超過顯示寬度限制,不會對插入的數據有任何影響,還是按照類型的實際寬度進行保存,即顯示寬度與類型可以存儲的值范圍無關
(5)從 MySQL 8.0.17 開始,整數數據類型不推薦使用顯示寬度屬性
(6)整型數據類型可以在定義表結構時,指定所需要的顯示寬度,如果不指定,則系統為每一種類型指定默認的寬度值,默認顯示寬度與其有符號數的最小值的寬度相同
2、UNSIGNED
(1)無符號類型(非負)
(2)所有的整數類型都有一個可選的屬性UNSIGNED(無符號屬性),無符號整數類型的最小取值為 0
(3)如果需要在 MySQL 數據庫中保存非負整數值時,可以將整數類型設置為無符號類型
(4)默認帶符號
3、ZEROFILL
(1)0 填充
(2)如果某列是 ZEROFILL,則 MySQL 會自動為當前列添加 UNSIGNED 屬性
(3)如果指定 ZEROFILL,不夠 M 位時,用 0 在左邊填充,如果超過 M 位,只要不超過數據存儲范圍即可
(4)例:在 int(M) 中,M 的值跟 int(M) 所占多少存儲空間並無任何關系。 int(3)、int(4)、int(8) 在磁盤上都是占用 4 bytes 的存儲空間
(5)nt(M),必須和 UNSIGNED ZEROFILL 一起使用才有意義,如果整數值超過 M 位,就按照實際位數存儲。只是無須再用字符 0 進行填充
4、應用場景
(1)TINYINT:一般用於枚舉數據,比如系統設定取值范圍很小且固定的場景
(2)SMALLINT:可以用於較小范圍的統計數據,比如統計工廠的固定資產庫存數量等
(3)MEDIUMINT:用於較大整數的計算,比如車站每日的客流量等
(4)INT(INTEGER):取值范圍足夠大,一般情況下不用考慮超限問題,用得最多,比如商品編號
(5)BIGINT :只有當處理特別巨大的整數時才會用到,比如雙十一的交易量、大型門戶網站點擊量、證券公司衍生產品持倉等
5、使用規范
(1)在評估使用整數類型時,需要考慮存儲空間、可靠性的平衡問題
(2)在實際工作中,系統故障產生的成本,遠遠超過增加幾個字段存儲空間所產生的成本
(3)首先確保數據不會超過取值范圍,在這個前提之下,再考慮如何節省存儲空間
浮點類型
1、FLOAT
(1)單精度浮點數
(2)占用 4 bytes
(3)有符號的取值范圍:-3.402823466E+38~-1.175494351E-38、0、-1.175494351E-38~-3.402823466E+38
(4)無符號的取值范圍:0、-1.175494351E-38~-3.402823466E+38
2、DOUBLE
(1)雙精度浮點數
(2)占用 8 bytes
(3)有符號的取值范圍:-1.7976931348623157E+308~-2.2250738585072014E-308、0、-2.2250738585072014E-308~-1.7976931348623157E+308
(4)無符號的取值范圍:0、-2.2250738585072014E-308~-1.7976931348623157E+308
3、REAL
(1)默認為 DOUBLE
(2)如果 SQL 模式設定為啟用 REAL_AS_FLOAT,則 MySQL 認為 REAL 是 FLOAT
(3)如果要啟用 REAL_AS_FLOAT,可以通過以下 SQL 語句實現
SET sql_mode = “REAL_AS_FLOAT”;
4、浮點數類型的無符號數取值范圍,是有符號數取值范圍的一半,即有符號數取值范圍大於等於零的部分
(1)MySQL 存儲浮點數的格式為:符號(S)、尾數(M)、階碼(E)
(2)無論有沒有符號,MySQL 浮點數都會存儲表示符號的部分
數據精度
1、對於浮點類型,在 MySQL 中單精度值使用 4 個字節,雙精度值使用 8 個字節
2、MySQL 允許使用非標准語法
(1)FLOAT(M, D)、DOUBLE(M, D),M 為精度 ,D 為標度,M=整數位+小數位,D=小數位,D<=M<=255,0<=D<=30
(2)其他數據庫未必支持,涉及到數據遷移,則不建議使用
(3)FLOAT、DOUBLE 在不指定 (M, D) 時,默認按照實際的精度顯示(由實際硬件和操作系統決定)
3、浮點類型允許加 UNSIGNED ,但是不會改變數據范圍
4、不管是否顯式設置精度 (M, D),MySQL 處理方案如下
(1)如果存儲時,整數部分超出范圍,MySQL 報錯,不允許存儲值
(2)如果存儲時,小數點部分若超出范圍,分以下情況
(3)若四舍五入后,整數部分沒有超出范圍,則只警告,但能成功操作,並四舍五入刪除多余的小數位后保存
(4)若四舍五入后,整數部分超出范圍,則 MySQL 報錯,並拒絕處理
5、MySQL 8.0.17
(1)FLOAT(M, D)、DOUBLE(M, D) 在官方文檔中明確不推薦使用,將來可能被移除
(2)關於浮點型 FLOAT、DOUBLE 的 UNSIGNED 不推薦使用,將來可能被移除
6、精度誤差
(1)采用二進制方式存儲浮點類型
(2)如果尾數不是 0 或 5,則無法用一個二進制數來精確表達,只能在取值允許的范圍內進行四舍五入
(3)浮點數是不准確的,要避免使用 = 來判斷兩個數是否相等
定點數類型
類型 | 占用字節數 | 有效范圍 |
DECIMAL(M,D),DEC,NUMERIC | M+2 | 由 M、D 決定 |
1、使用 DECIMAL(M, D) 方式表示高精度小數
(1)M 為精度(最大位數),1 <= M <= 65
(2)D 為標度(小數),0 <= D <= 30
(3)D <= M
(4)最大取值范圍與 DOUBLE 類型一樣,但是有效數據范圍由 M、D 決定
(5)存儲空間不固定,由精度值 M 決定,總共占用的存儲空間為 M+2 個字節
2、精度
(1)在 MySQL 內部是以字符串的形式進行存儲,即一定是精准的
(2)當 DECIMAL 類型不指定精度和標度時,默認為 DECIMAL(10, 0)
(3)當數據精度超出定點數類型的精度范圍時,則 MySQL 進行四舍五入處理
3、默認帶符號,定義無符號,在類型后加上 UNSIGNED
空值
1、所有運算符或列值遇到 null 值,運算的結果都為 null
2、在 MySQL 中, 空值不等於空字符串,且占用空間
3、一個空字符串的長度為 0,而一個空值的長度為空
位類型
1、存儲二進制值
二進制字符串類型 | 長度 | 長度范圍 | 占用空間 |
BIT(M) | M | 1 <= M <= 64 | 約為 (M + 7) / 8 個字節 |
2、M 表示二進制的位數
(1)如果沒有指定 (M),默認值 1
(2)1 <= M <= 64
3、按照十六進制顯示;按照十進制添加
4、注意:在向 BIT 類型的字段中插入數據時,一定要確保插入的數據在 BIT 類型支持的范圍內
日期與時間類型
類型 | 名稱 | 字節 | 日期格式 | 最小值 | 最大值 |
YEAR | 年 | 1 | YYYY 或 YY | 1901 | 2155 |
TIME | 時間 | 3 | HH:MM:SS | -838:59:59 | 838:59:59 |
DATE | 日期 | 3 | YYYY-MM-DD | 1000-01-01 | 9999-12-03 |
DATETIME | 日期時間 | 8 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 日期時間 | 4 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:00 UTC | 2038-01-19 03:14:07 UTC |
YEAR
1、表示年份,占用 1個 字節
2、以 4 位字符串,或數字格式表示 YEAR 類型,其格式為 YYYY,最小值為 1901,最大值為 2155
3、以 2 位字符串格式表示 YEAR 類型,最小值為 00,最大值為 99
(1)當取值為 01 到 69 時,表示 2001 到 2069
(2)當取值為 70 到 99 時,表示 1970 到 1999
(3)當取值整數的 0 或 00 添加的話,則為 0000 年
(4)當取值是日期 / 字符串的 0 添加的話,則為 2000 年
4、版本
(1)MySQL 5.5.27 開始,2 位格式的 YEAR 不推薦使用,YEAR 默認格式 YYYY,不需要寫成 YEAR(4)
(2)MySQL 8.0.19 開始,不推薦使用指定顯示寬度的 YEAR(4) 數據類型
DATE
1、表示日期,沒有時間部分
2、格式:YYYY-MM-DD
(1)YYYY:年份
(2)MM:月份
(3)DD:日期
3、占用 3 個字節
4、在向DATE類型的字段插入數據時,同樣需要滿足一定的格式條件
(1)以 YYYY-MM-DD,或 YYYYMMDD 表示的字符串日期,最小取值為 1000-01-01,最大取值為 9999-12-03,YYYYMMDD 會被轉化為 YYYY-MM-DD
(2)以 YY-MM-DD,或 YYMMDD 表示的字符串日期,此格式中,年份為兩位數值,或字符串滿足 YEAR 類型的格式條件為:當年份取值為 00 到 69 時,轉化為2000到2069;當年份取值為 70 到 99 時,轉化為 1970 到 1999
(3)使用 CURRENT_DATE() 或 NOW() 函數,會插入當前系統的日期
TIME
1、表示時間,不包含日期部分
2、不只表示一天之內的時間,而且可以用來表示一個時間間隔,這個時間間隔可以超過 24 小時
3、占用 3 個字節
4、格式:HH:MM:SS
(1)HH:小時
(2)MM:分鍾
(3)SS:秒
5、在 MySQL 中,向 TIME 類型的字段插入數據時,可以使用幾種不同的格式
(1)可以使用帶有冒號的字符串,格式:D HH:MM:SS、HH:MM:SS、HH:MM、D HH:MM、D HH、SS,都能被正確地插入TIME類型的字段中,D 表示天,最小值為 0,最大值為 34,如果使用帶有 D 格式的字符串插入 TIME 類型的字段時,D 會被轉化為小時,計算格式為 D * 24 + HH,當使用帶有冒號並且不帶 D 的字符串表示時間時,表示當天的時間,如:12:10 表示 12:10:00,而不是 00:12:10
(2)可以使用不帶有冒號的字符串或者數字,格式:HHMMSS 或 HHMMSS,如果插入一個不合法的字符串或者數字,MySQL 在存儲數據時,將其自動轉化為 00:00:00 進行存儲,如:1210,MySQL 將最右邊的兩位解析成秒,表示 00:12:10,而不是12:10:00
(3)使用 CURRENT_TIME() 或 NOW() ,會插入當前系統的時間
DATETIME
1、占用 8 個字節
2、格式為 DATE、TIME 組合:YYYY-MM-DD HH:MM:SS
(1)YYYY:年份
(2)MM:月份
(3)DD:日期
(4)HH:小時
(5)MM:分鍾
(6)SS:秒
3、向 DATETIME 類型的字段插入數據時,同樣需要滿足一定的格式條件
(1)以 YYYY-MM-DD HH:MM:SS,或 YYYYMMDDHHMMSS 字符串,插入 DATETIME 類型字段時,最小值為 1000-01-01 00:00:00,最大值為 9999-12-03 23:59:59
(2)以 YYYYMMDDHHMMSS 數字,插入 DATETIME 類型字段時,轉化為 YYYY-MM-DD HH:MM:SS 格式
(3)以 YY-MM-DD HH:MM:SS 或 YYMMDDHHMMSS 字符串,插入 DATETIME 類型字段時,兩位數的年份規則符合 YEAR 類型的規則,00 到 69 表示 2000 到 2069;70 到 99 表示 1970 到 1999
(4)使用函數 CURRENT_TIMESTAMP() 和 NOW(),可以向 DATETIME 類型的字段插入系統的當前日期和時間
TIMESTAMP
1、可以表示日期時間
2、占用 4 個字節
3、顯示格式與 DATETIME 類型相同:YYYY-MM-DD HH:MM:SS
4、時間范圍:1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC
(1)UTC 表示世界統一時間 / 世界標准時間
(2)存儲數據時,需要對當前時間所在的時區進行轉換;查詢數據時,再將時間轉換回當前的時區
(3)使用 TIMESTAMP 存儲的同一個時間值,在不同的時區查詢時,會顯示不同的時間
(4)向 TIMESTAMP 類型的字段插入數據時,當插入數據格式滿足 YY-MM-DD HH:MM:SS、YYMMDDHHMMSS 時,兩位數值的年份同樣符合 YEAR 類型的規則條件,但表示時間范圍要小很多
(5)如果向 TIMESTAMP 類型字段,插入的時間超出 TIMESTAMP 范圍,則 MySQL 拋出錯誤信息
5、TIMESTAMP、DATETIME 區別
(1)TIMESTAMP 存儲空間較小,表示的日期時間范圍較小
(2)底層存儲方式不同,TIMESTAMP 底層存儲的是毫秒值,距離 1970-1-1 0:0:0 0 毫秒的毫秒值
(3)兩個日期比較大小或日期計算時,TIMESTAMP 更方便、更快
(4)TIMESTAMP 和時區有關,TIMESTAMP 根據用戶的時區不同,顯示不同的結果
(5)DATETIME 只能反映出插入時當地的時區,其他時區的人查看數據必然有誤差
6、開發經驗
(1)最多使用 DATETIME 類型,包括完整的日期和時間信息,取值范圍也最大
(2)一般存注冊時間、商品發布時間等,使用 TIMESTAMP ,便於計算
在所有數據庫中,標准是單引號,字符串統一使用 '' 括起
1、MySQL 的字符串可以使用 ""
2、Oracle 的字符串不可使用 ""
3、MySQL 中,字符串的兩個連續 '' 或 "",則只把一個 ' 或 " 作為字符串;或使用 \ 轉義字符,把 ' 或 " 轉換為普通字符
CHAR、VARCHAR 類型
字符串(文本)類型 | 特點 | 長度 | 長度范圍(byte) | 占用字節 |
CHAR(M) | 固定長度 | M | 0 <= M <= 255 | M |
VARCHAR(M) | 可變長度 | M | 0 <= M <= 65535 | 實際長度 + 1~3 |
1、CHAR(M)
(1)需要預先定義字符串長度
(2)如果不指定 (M),則表示長度默認是 1 個字符
(3)如果保存時,數據實際長度比 CHAR 類型聲明的長度小,則會在右側填充空格以達到指定的長度
(4)當 MySQL 檢索 CHAR 類型的數據時,CHAR 類型的字段會去除尾部的空格
(5)定義 CHAR 類型字段時,聲明的字段長度,為 CHAR 類型字段所占存儲空間的字節數
(6)對於 CHAR(M) 類型的列來說,當列采用的是定長編碼的字符集時,該列占用的字節數不會被加到變長字段長度列表;而如果采用變長編碼的字符集時,該列占用的字節數就會被加到變長字段長度列表
(7)COMPACT 行格式下,采用變長編碼字符集的 CHAR(M) 類型的列要求至少占 M 個字節,這主要是希望在將來更新該列時, 在新值的字節長度大於舊值字節長度但不大於 M 個字節,可以在該記錄處直接更新,而不是在存儲空間中再重新分配一個新的記錄空間,導致原有的記錄空間成為碎片
2、VARCHAR(M)
(1)定義時, 必須指定長度 M,否則報錯
(2)MySQL 4.0 版本以下,M 表示字節
(3)MySQL 5.0 版本以上,M 表示字符
(4)檢索 VARCHAR 類型的字段數據時,保留數據尾部的空格
(5)占用空間:0 ~ 65535 bytes:插入字符個數、編碼決定實際占用空間,反之,根據編碼不同,存放字符最大上限不同
(6)實際可用空間:65535 bytes 包括所有字段的長度,變長字段的長度標識(每個變長字段額外使用 1 或 2 個字節記錄實際數據長度)、NULL 標識位的累計
(7)NULL 標識位:如果 VARCHAR 字段定義中帶有 DEFAULT NULL,則需要需要 1 bit 來標識,每 8 bits 標識組成一個字段。一張表中存在 N 個 VARCHAR 字段,那么需要(N+7)/8 (取整)bytes 存儲所有 NULL 標識位
(8)假設:某個字符集中最多需要 W 字節來表示一個字符、指定存儲最多 M 個字符(注意是字符不是字節)、實際存儲的字符串占用 L 字節,則 M * W 為字符串最多占用的字節數
(9)若 M * W <= 255,那么使用 1 字節來表示真實數據占用的字節數
(10)InnoDB 在讀取記錄的變長字段長度列表時先查看表結構,如果某個變長字段允許存儲的最大字節數 <= 255,可以認為只使用 1 字節來表示真實數據占用的字節數
(11)如果 M * W > 255,且 L <= 127,則用 1 字節來表示真實數據占用的字節數
(12)如果 M * W > 255,且 L > 127,則用 2 字節來表示真實數據占用的字節數
(13)InnoDB 在讀取記錄的變長字段長度列表時先查看表結構,如果某個變長字段允許存儲的最大字節數 > 255,如何區分它正在讀的某個字節是一個單獨的字段長度還是半個字段長度?使用該字節的第一個二進制位作為標志位:如果該字節的第一個位為 0,該字節就是一個單獨的字段長度;如果該字節的第一個位為 1,該字節就是半個字段長度
3、對比
類型 | 特點 | 空間上 | 時間上 | 應用場景 |
CHAR(M) | 固定長度 | 浪費存儲空間 | 效率高 | 存儲不大,速度要求高 |
VARCHAR(M) | 可變長度 | 節省存儲空間 | 效率低 | 非 CHAR 情況 |
(1)存儲很短的信息,使用 CHAR
(2)固定長度,如:使用 uuid 作為主鍵,使用 CHAR
(3)十分頻繁改變 column,使用 CHAR
(4)MyISAM:使用 CHAR 代替 VARCHAR,使得整個表靜態化,從而使數據檢索更快,空間換時間
(5)MEMORY:無論使用 CHAR 或 VARCHAR,兩者都作為 CHAR 處理
(6)InnoDB:建議使用 VARCHAR,對於 InnoDB,內部行存儲格式並沒有區分 CHAR、VARCHAR,所有數據行都使用指向數據列值的頭指針,且主要影響性能因素是數據行使用的存儲總量,由於 CHAR 平均占用空間多於 VARCHAR,除簡短且固定長度,
否則選擇 VARCHAR,節省空間,對磁盤 I/O 和數據存儲總量較好
TEXT
1、系統自動按照實際長度存儲,不需要預先定義長度
文本字符串類型 | 特點 | 長度 | 長度范圍(字符) | 占用字節 |
TINYTEXT | 小文本、可變長度 | L | 0 <= L <= 255 | L + 1 |
TEXT | 文本、可變長度 | L | 0 <= L <= 65535 | L + 2 |
MEDIUMTEXT | 中等文本、可變長度 | L | 0 <= L <= 16777215 | L + 3 |
LONGTEXT | 大文本、可變長度 | L | 0 <= L <= 4294967295 | L + 4 |
2、由於實際存儲的長度不確定,MySQL 不允許 TEXT 類型的字段做主鍵
3、在保存和查詢數據時,不刪除 TEXT 數據尾部的空格
4、開發
(1)TEXT 文本類型,可以存比較大的文本段,搜索速度稍慢
(2)TEXT、BOLO 類型數據刪除后容易導致空洞,使得文件碎片比較多,頻繁使用的表,不建議包含 TEXT 類型字段,建議單獨使用一個表
ENUM / 枚舉
1、取值范圍需要在定義字段時進行指定
2、所需要的存儲空間由定義ENUM類型時指定的成員個數決定
文本字符串類型 | 長度 | 長度范圍(L 表示實際成員個數) | 占用字節 |
ENUM | L | 1 <= L <= 65535 | 1 或 2 |
(1)當 ENUM 包含 1~255 個成員時,需要 1 個字節的存儲空間
(2)當 ENUM 包含 256~65535 個成員時,需要 2 個字節的存儲空間
3、插入數據
(1)忽略大小寫
(2)允許按照角標的方式,獲取指定索引位置的枚舉值
(3)當 ENUM 字段沒有聲明為 NOT NULL 時,插入 NULL 有效
(4)設置字段值時,只允許從成員中選取單個值,不能一次選取多個值
SET
1、表示一個字符串對象
2、可以包含 0 個或多個成員,成員個數的上限為 64
3、當 SET 包含成員個數不同時,占用的存儲空間不同
成員個數范圍(L 表示實際成員個數) | 占用字節 |
1 <= L <= 8 | 1 |
9 <= L <= 16 | 2 |
17 <= L <= 24 | 3 |
25 <= L <= 32 | 4 |
33 <= L <= 64 | 8 |
4、插入數據
(1)插入重復 SET 成員時,MySQL 自動刪除重復成員
(2)設置字段值時,可以取范圍內的 0 個或多個值
(3)向 SET 字段插入 SET 成員中不存在的值時,MySQL 拋出錯誤
BINARY、VARBINARY
1、BINARY、VARBINARY 類似 CHAR、VARCHAR,只是它們存儲二進制字符串
二進制字符串類型 | 特點 | 值的長度 | 占用字節 |
BINARY(M) | 固定長度 | 0 <= M <= 255 | M |
VARBINARY(M) | 可變長度 | 0 <= M <= 65535 | M+1 |
2、BINARY(M)
(1)固定長度的二進制字符串
(2)M:表示最多能存儲的字節數,取值范圍:0~255 個字符
(3)如果未指定 (M),表示只能存儲 1 個字節,如果字段值不足 (M) 個字節,將在右邊填充 \0 以補齊指定長度
3、VARBINARY(M)
(1)可變長度的二進制字符串
(2)M:表示最多能存儲的字節數,總字節數不能超過行的字節長度限制 65535,另外還要考慮額外字節開銷,VARBINARY 除了存儲數據本身外,還需要 1 或 2 個字節來存儲數據的字節數
(3)VARBINARY 必須指定(M) ,否則報錯
BLOB
1、二進制大對象 ,可以容納可變數量的數據
2、開發中,不會在 MySQL 數據庫中使用 BLOB 存儲大對象數據,通常會將圖片、音頻、視頻存儲到服務器磁盤上 ,並將圖片、音頻、視頻的訪問路徑存儲到 MySQL 中
二進制字符串類型 | 值的長度 | 長度范圍(byte) | 占用字節 |
TINYBLOB | L | 0 <= L <= 255 | L + 1 |
BLOB | L | 0 <= L <= 65535(相當於 64 KB) | L + 2 |
MEDIUMBLOB | L | 0 <= L <= 16777215(相當於 16 MB) | L + 3 |
LONGBLOB | L | 0 <= L <= 4294967295(相當於 4 GB) | L + 4 |
3、TEXT、BLOB 事項
(1)執行大量的刪除或更新操作時,會在數據表中留下很大的空洞,以后填入這些空洞的記錄可能長度不同,為了提高性能,建議定期使用 OPTIMIZE TABLE 功能對這類表進行碎片整理
(2)如果需要對大文本字段進行模糊查詢,MySQL 提供前綴索引,在不必要時,避免檢索大型 BLOB 或 TEXT 值
(3)BLOB 或 TEXT 分離到單獨表中,在某些環境中,如果把這些數據列移動到第二張數據表中,把原數據表中的數據列轉換為固定長度的數據行格式,,這會減少主表中的碎片,得到固定長度數據行的性能優勢,在主數據表上運行 SELECT * 查詢時候不會通過網絡傳輸大量 BLOB 或 TEXT 值
JSON
1、JavaScript Object Notation
2、一種輕量級的數據交換格式,簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言,易於人閱讀和編寫,同時易於機器解析和生成,並有效地提升網絡傳輸效率
3、JSON 可以將 JavaScript 對象中一組數據轉換為字符串,在網絡或者程序之間輕松地傳遞這個字符串,並在需要時將它還原為各編程語言所支持的數據格式
4、在 MySQL 5.7 中,已經支持 JSON 數據類型
5、在 MySQL 8.x 版本中,JSON 類型提供可以進行自動驗證的 JSON 文檔和優化的存儲結構,使得在 MySQL 中存儲和讀取 JSON 類型數據更加方便和高效
6、當需要檢索 JSON 字段中數據的某個具體值時,可以使用 -> 和 ->> 符號
空間類型
1、MySQL 支持地理特征的生成、存儲、分析
2、MySQL 中使用 Geometry(幾何) 來表示所有地理特征,Geometry 指一個點或點的集合,代表世界上任何具有位置的事物
3、MySQL 空間數據類型(Spatial Data Type)對應 OpenGIS 類
(1)單值類型:GEOMETRY、POINT、LINESTRING、POLYGON
(2)集合類型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION
4、Geometry:所有空間集合類型的基類,其他類型如 POINT、LINESTRING、POLYGON 都是 Geometry 子類
5、Point:點,坐標值支持 DECIMAL 類型,經度(longitude)在前,維度(latitude)在后,用空格分隔
6、LineString:線,由一系列點連接而成,如果線從頭至尾沒有交叉,則為簡單(simple);如果起點和終點重疊,則為封閉(closed),點與點之間用逗號分隔,一個點中的經緯度用空格分隔,與 POINT 格式一致
7、Polygon:多邊形,可以是一個實心平面形,即沒有內部邊界,也可以有空洞,類似紐扣
類型選擇
1、在定義數據類型時
(1)整數:選擇 INT
(2)小數:選擇定點數類型 DECIMAL(M, D)
(3)日期與時間:選擇 DATETIME
2、字符串選擇
(1)任何字段如果為非負數,必須是 UNSIGNED
(2)小數類型為 DECIMAL,禁止使用 FLOAT 和 DOUBLE
(3)如果存儲的字符串長度幾乎相等,使用 CHAR 定長字符串類型
(4)VARCHAR 是可變長字符串,不預先分配存儲空間,長度不要超過 5000,如果存儲長度大於此值,定義字段類型為 TEXT,獨立出來一張表,用主鍵來對應,避免影響其它字段索引效率