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 提供了一組廣泛的功能來處理它時,它只支持某種類型的數據。