MySQL 学习笔记(12)— 数据类型(定长字符、变长字符、字符串大对象、数字类型、日期时间类型、二进制类型)
MySQL 常見的數(shù)據(jù)類型有字符串類型、數(shù)字類型、時間類型、二進制類型。具體的分類如下圖:
1. 字符串類型
字符串類型用于存儲字符和字符串數(shù)據(jù),主要包含三種具體的類型:定長字符串、變長字符串以及字符串大對象。各種數(shù)據(jù)庫對于字符串類型的支持如下:
| 數(shù)據(jù)類型 | Oracle | MySQL | SQL Server | PostgreSQL |
|---|---|---|---|---|
| 定長字符串 | CHAR(n) | CHAR(n) | CHAR(n) | CHAR(n) |
| 變長字符串 | VARCHAR2(n) | VARCHAR(n) | VARCHAR(n) | VARCHAR(n) |
| 字符串大對象 | CLOB | TEXT | VARCHAR( MAX ) | TEXT |
在 SQL 中,輸入字符串類型的常量和數(shù)據(jù)時,需要使用單引號引用。
1.1 定長字符串
CHAR(n) 表示長度固定的字符串,其中 n 表示字符串的長度。常見的定義方式包括:
- CHAR,長度為 1 的字符串,只能存儲 1 個字符;
- CHAR(5),長度為 5 的字符串。
對于定長字符串,如果輸入的字符串長度不夠,將會使用空格進行填充。通常來說,只有存儲固定長度的數(shù)據(jù)時,才會考慮使用定長字符串類型。例如 18 位身份證,6 位郵政編碼等。
1.2 變長字符串
VARCHAR(n) 表示長度不固定的字符串,其中 n 表示允許存儲的最大長度。對于變長字符串,如果輸入的字符串長度不夠定義的最大長度,則存儲實際的內(nèi)容。
CHAR VARYING和CHARACTER VARYING是VARCHAR的同義詞,可以通用。 Oracle 中使用 VARCHAR2 表示變長字符串類型。
變長字符串類型一般用于存儲長度不固定的內(nèi)容。
1.3 字符串大對象
CLOB 表示字符串大對象,通常用于存儲普通字符串類型無法支持的更長的字符串數(shù)據(jù)。例如整篇文章、備注、評論等。
Oracle使用CLOB類型存儲大型字符串;MySQL提供了TINYTEXT、TEXT、MEDIUMTEXT以及LONGTEXT分別用于存儲不同長度的文本數(shù)據(jù);SQL Server使用VARCHAR( MAX )存儲大文本數(shù)據(jù);PostgreSQL提供了TEXT類型存儲任意長度的字符串;
CHARACTER LARGE OBJECT和CHAR LARGE OBJECT是CLOB的同義詞,可以通用。
2. 數(shù)字類型
數(shù)字類型主要分為兩類:精確數(shù)字和近似數(shù)字。各種數(shù)據(jù)庫對于數(shù)字類型的支持如下:
| 數(shù)據(jù)類型 | Oracle | MySQL | SQL Server | PostgreSQL |
|---|---|---|---|---|
| 精確數(shù)字 | SMALLINT INTEGER NUMERIC(p, s) | SMALLINT INTEGER BIGINT NUMERIC(p, s) | SMALLINT INTEGER BIGINT NUMERIC(p, s) | SMALLINT INTEGER BIGINT NUMERIC(p, s) |
| 近似數(shù)字 | BINARY_FLOAT BINARY_DOUBLE | FLOAT DOUBLE PRECISION | REAL DOUBLE PRECISION | REAL DOUBLE PRECISION |
2.1 精確數(shù)字
精確數(shù)字類型用于存儲整數(shù)或者包含固定小數(shù)位的數(shù)字。其中, SMALLINT 、 INTEGER 和 BIGINT 都可以表示整數(shù)。
對于 MySQL 、 SQL Server 以及 PostgreSQL ,
SMALLINT支持 -32768 ~ 32767;INTEGER支持 -2147483648 ~ 2147483647;BIGINT支持 -263 ~ 263-1。
Oracle 中的 SMALLINT 和 INTEGER 都是 NUMBER(38,0) 的同義詞; Oracle 不支持 BIGINT 關鍵字。
INT 是 INTEGER 的同義詞,可以通用。 MySQL 中還提供了 TINYINT ,支持 -128 ~ 127; MEDIUMINT 支持 -8388608 ~ 8388607。另外,MySQL 中的所有整型分為有符號類型(例如 INTEGER 、 INTEGER SIGNED )和無符號類型(例如 INTEGER UNSIGNED ),無符號整型支持的正整數(shù)范圍擴大了一倍。
NUMERIC(p, s) 和 DECIMAL(p, s) 可以看作相同的類型,用于存儲包含小數(shù)的精確數(shù)字。
其中,精度 p 表示總的有效位數(shù),刻度 s 表示小數(shù)點后允許的位數(shù)。例如,123.04 的精度為 5,刻度為 2。 p 和 s 是可選的, s 為 0 表示整數(shù)。 SQL 標準要求 p ≥ s ≥ 0 并且 p > 0 。
DEC 是 DECIMAL 的同義詞,可以通用。 Oracle 中的 NUMERIC 和 DECIMAL 都是 NUMBER 的同義詞。
整數(shù)類型通常用于存儲數(shù)字 id、產(chǎn)品數(shù)量、課程得分等數(shù)字; NUMERIC 用于存儲產(chǎn)品價格、銷售金額等包含小數(shù)并且準確度要求高的數(shù)據(jù)。
2.2 近似數(shù)字
近似數(shù)字也稱為浮點型數(shù)字,一般使用較少,主要用于科學計算領域。
REAL 表示單精度浮點數(shù),通常精確到小數(shù)點后 6 位;DOUBLE PRECISION 表示雙精度浮點數(shù),通常精確到小數(shù)點后 15 位。浮點數(shù)運算更快,但是可能丟失精度;浮點數(shù)的比較運算可能會導致非預期的結果。
Oracle使用BINARY_FLOAT和BINARY_DOUBLE表示浮點數(shù)。MySQL使用FLOAT表示單精度浮點數(shù),同時區(qū)分有符號和無符號的浮點數(shù)。
3. 日期時間類型
DATE存儲年、月、日;TIME存儲時、分、秒,以及秒的小數(shù)部分;TIMESTAMP同時包含年、月、日、時、分、秒,以及秒的小數(shù)部分。
各數(shù)據(jù)庫的差異:
Oracle中的DATE類型包含了額外的時、分、秒,不支持TIME類型。SQL Server使用DATETIME2和DATETIMEOFFSET表示時間戳。MySQL還支持DATETIME表示時間戳。
4. 二進制類型
二進制類型用于存儲二進制數(shù)據(jù),例如文檔、圖片,視頻等。二進制類型具體包含以下三種:
BINARY(n),固定長度的二進制數(shù)據(jù),n表示二進制字符數(shù)量;VARBINARY(n),可變長度的二進制數(shù)據(jù),n表示支持的最大二進制字符數(shù)量;BLOB,二進制大對象。
各數(shù)據(jù)庫差異:
Oracle支持BLOB二進制類型;MySQL支持BINARY、VARBINARY以及TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB二進制類型;SQL Server支持BINARY、VARBINARY以及VARBINARY ( MAX )二進制類型;PostgreSQL支持BYTEA二進制類型。
5. 如何選擇數(shù)據(jù)類型
一般來說,先確定基本的類型:
- 文本數(shù)據(jù),只能使用字符串類型;
- 數(shù)值數(shù)據(jù),尤其是需要進行數(shù)學運算的數(shù)據(jù),選擇數(shù)字類型;
- 日期和時間信息,最好使用原生的日期時間類型;
- 文檔、圖片、音頻和視頻等,使用二進制類型;或者可以考慮存儲在文件服務器上,然后在數(shù)據(jù)庫中存儲文件的路徑。
接下來需要進一步確定具體的數(shù)據(jù)類型。在滿足數(shù)據(jù)存儲和擴展的前提下,盡量使用更小的數(shù)據(jù)類型,可以節(jié)省一些存儲,通常性能也會更好。
對于字符數(shù)據(jù),一般使用 VARCHAR 類型;如果數(shù)據(jù)長度能夠確保一致,可以使用 CHAR ;指定最大長度時,滿足存儲需求的前提下盡量使用更小的值。
不要使用字符串存儲日期時間數(shù)據(jù),它們無法支持數(shù)據(jù)的運算。例如獲得兩個日期之間的間隔,需要依賴應用程序進行轉換和處理。
參考:
https://gitbook.cn/gitchat/column/undefined/topic/5db92c23a9c3a53bc3800f0d
總結
以上是生活随笔為你收集整理的MySQL 学习笔记(12)— 数据类型(定长字符、变长字符、字符串大对象、数字类型、日期时间类型、二进制类型)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信网名男生霸气头像
- 下一篇: MySQL 学习笔记(13)— 创建表、