CodeGym /Adesua ahorow /SQL & Hibernate /SQL 中的數據類型

SQL 中的數據類型

SQL & Hibernate
等級 4 , 課堂 0
開放

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

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION