SQL 數據類型介紹
與 JavaScript 不同,SQL 具有強類型。在每個表中,每一列都有自己固定的數據類型。
數據類型有很多,但是和Java語言不同的是,之所以有這麼多,並不是因為有適用於所有場合的數據類型。數據庫非常依賴於數據的大小,因此許多數據類型僅在長度上有所不同。
總的來說,數據類型可以分為 5 組:
- 數值類型
- 字符串類型
- 存儲日期和時間的類型
- 對象:通常表示為字節集合
- 傳輸:JSON 和 XML
通常不同的 DBMS 仍然有自己的數據類型。每個 DBMS 都有自己的專長,因此添加新的數據類型是很常見的事情。
另一件事是僅僅添加一個新的數據類型是不夠的,你需要添加將與其一起工作的函數,並且使這項工作方便快捷。
如果您在任何工業(企業)DBMS 上工作,那麼很可能您將不得不處理它的數據類型和功能。有必要閱讀 2-5 本好書。
作為熟悉 SQL 的一部分,我們將考慮三組主要的數據類型:
- 數字
- 字符串
- 日期
SQL 中的數值類型
在 SQL 中,數字類型分為三組:
- 整數類型
- 定點數(固定小數位數)
- 浮點數字
讓我們從整數開始。它們只有5個,可以用一張表來描述:
# | 類型名稱 | 字節長度 | 來自 Java 的模擬 | 最小值 | 最大值 |
---|---|---|---|---|---|
1個 | 微信 | 1個 | 字節 | -128 | 127 |
2個 | 小情報 | 2個 | 短的 | -32.768 | 32.767 |
3個 | 媒體 | 3個 | -8,388,608 | 8,388,607 | |
4個 | 情報局 | 4個 | 整數 | -2,147,483,648 | 2,147,483,647 |
5個 | 大數據 | 8個 | 長的 | -2 63 | 2 63-1 |
數據類型與 Java 數據類型非常相似,但還有一種長度為三個字節的整數類型。這樣做是為了節省尺寸。
接下來是浮點類型,就像在 Java 中一樣,只有兩個:
# | 類型名稱 | 字節長度 | 來自 Java 的模擬 | 最小值 | 最大值 |
---|---|---|---|---|---|
1個 | 漂浮 | 4個 | 漂浮 | -3.40E+38 | +1.18E+38 |
2個 | 雙倍的 | 8個 | 雙倍的 | -1.79E+308 | +1.79E+308 |
同樣,沒有什麼新鮮事。一切都和 Java 一樣。但是,與 Java 不同的是,SQL 有另一種特殊類型,即定點實數。它叫做十進制。
通常這種類型用於存儲金額。當寫入該類型的名稱時,通常在其後表示該數字在小數點前後有多少位小數。一般格式如下所示:
DECIMAL(total_characters, after_comma)
還有一個小例子:
salary DECIMAL(5,2)
這就是我們如何描述工資列可以包含整數(最多 3 位小數)和小數部分 - 2 位小數這一事實。
DECIMAL 類型支持的最大字符數是 65。
SQL 中的字符串類型
數據庫中的行可以以兩種形式存儲:
- 定長字符串
- 可變長度的字符串
固定長度的字符串被指定為CHAR:
CHAR(length)
固定長度意味著該列的所有值將包含嚴格固定數量的字符。
固定長度字符串的示例:
country_code CHAR(2)
可變長度字符串由VARCHAR類型指定:
VARCHAR(max_length)
可變長度意味著該列的所有值將包含任意長度的文本,但不超過最大長度。
可變長度字符串示例:
phone VARCHAR(12)
固定長度的字符串有一個非常大的優勢。如果客戶端要求 SQL Server 返回表中的第 1,000,000 行,並且表中的行是固定長度的,那麼,知道行的長度,就可以很容易地計算出與所需的字節相關的字節數排。
在行長度可變的情況下,將無法在表中快速找到所需的行。記住訪問ArrayList和LinkedList的速度,這裡的情況大致相同。
讓我們比較不同長度的字符串如何根據數據類型存儲在表中。
線 | 字符(4) | 要存儲的字節 | 變量(4) | 要存儲的字節 | |
---|---|---|---|---|---|
'' | ' ' | 4個 | '' | 1個 | |
'ab' | 'ab' | 4個 | 'ab' | 3個 | |
'A B C D' | 'A B C D' | 4個 | 'A B C D' | 5個 | |
'abcdefgh' | 'A B C D' | 4個 | 'A B C D' | 5個 |
筆記。VARCHAR 類型對於相同的長度需要多一個字節,因為它必須額外存儲字符串的長度。
SQL 中的臨時類型
SQL 還有用於存儲日期和時間的特殊類型。一共有五種類型:
# | 類型名稱 | 來自 Java DateTime API 的模擬 | 例子 | 最小值 | 最大值 |
---|---|---|---|---|---|
1個 | 日期 | 本地日期 | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2個 | 時間 | 當地時間 | 'hh:mm:ss[.分數]' | '-838:59:59.000000' | '838:59:59.000000' |
3個 | 約會時間 | 本地日期時間 | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4個 | 時間戳 | 日期 | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5個 | 年 | 1901年 | 2155 |
查詢中的所有數據都寫成字符串 - 用單引號括起來。條目格式從大到小:
- 年
- 月
- 天
- 小時
- 分鐘
- 第二
- 一秒的分數
DATE、TIME 和 DATETIME 類型通常被認為是 Java DateTme API 中類型的類似物:LocalDate、LocalTime、LocalDateTime。邏輯大致相同。
TIMESTAMP 類型以毫秒為單位存儲自 1970 年初以來的數據(UNIX 操作系統標準)。Java語言中的Date類型就是以這種形式存儲的。
最後是 YEAR 類型,它有 1 個字節長,存儲 1 到 255 之間的值。因此,它可用的年份範圍是 1901-2155。這種類型不能存儲 1900 年,因為值 0 用於編碼 NULL 值。
在 SQL 中存儲對象
有一些特殊類型可以存儲很長的對像或文本。我們不會詳細介紹它們,但無論如何我都會列出它們:
# | 類型名稱 | 解釋 |
---|---|---|
1個 | 文本 | 用於存儲長文本。對該字段進行比較和排序時,僅使用前 100 個字符。 |
2個 | BLOB | 該名稱代表字節大對象。僅存儲為字節集合。例如,可用於將圖片存儲在數據庫中。 |
3個 | CLOB | 該名稱代表 Char Large Object。用於存儲長文本。 |
4個 | 枚舉 | 允許您設置一組固定的值並將其中一個值存儲為一個值。 |
5個 | 放 | 允許您設置一組固定的值並將它們的任何子集存儲為一個值。通常將它們存儲為二進制掩碼。 |
理論上,您可以將任何 Java 對象序列化為一組字節,並將其作為 BLOB 存儲在數據庫中。保存對像不是問題。如何與他進一步合作?
假設一個表以序列化形式存儲了一百萬個對象——您將如何搜索它們?當 DBMS 提供了一組廣泛的功能來處理它時,它只支持某種類型的數據。
GO TO FULL VERSION