有許多類(lèi)型的數據與 SQL Server 兼容,重要的是要了解它們是什么以避免不兼容的數據類(lèi)型出現問(wèn)題。理解兼容的數據類(lèi)型也是理解數據類(lèi)型優(yōu)先級的基礎,它決定了在處理兩種不同類(lèi)型的對象時(shí)會(huì )產(chǎn)生什么類(lèi)型的數據。 在本指南中,我們將介紹 SQL Server 支持的所有數據類(lèi)型,以及使用 Transact-SQL 或 Microsoft .NET Framework 定義自定義數據類(lèi)型的過(guò)程。
什么是 SQL Server?
在深入了解 SQL Server 支持的許多數據類(lèi)型之前,先快速回顧一下 SQL Server 是什么。Microsoft 開(kāi)發(fā)了 SQL Server 作為關(guān)系數據庫管理系統 (RDBMS)。SQL Server 使用 SQL,這是使用各種關(guān)系數據庫的標準語(yǔ)言。 Microsoft 的 SQL Server 不再專(zhuān)屬于 Windows 環(huán)境,現在可以在 Linux 上使用,這對于有興趣使用 SQL Server 的人來(lái)說(shuō)是個(gè)好消息。此外,微軟的云平臺 Azure 支持 SQL Server。因此,如果您需要一個(gè)地方來(lái)托管它,那么沒(méi)有比原生解決方案更好的地方了。
微軟將其稱(chēng)為“最了解 SQL Server 的云”,Azure SQL Server 確實(shí)受益于無(wú)縫集成、簡(jiǎn)單性和可靠性,因為服務(wù)器和云基礎設施都是由同一家公司開(kāi)發(fā)和維護的。 但是,無(wú)論您在何處托管 SQL Server,都必須注意 SQL Server 使用的 SQL 語(yǔ)言略有不同。Microsoft 開(kāi)發(fā)了 Transact-SQL (T-SQL),它與標準 SQL 非常相似,但定義了一組對 SQL Server 編程所必需的專(zhuān)有概念。 如果您熟悉 SQL,則使用 Transact-SQL 并不難,您將能夠輕松使用 SQL Server。但有效使用 SQL Server 的另一個(gè)關(guān)鍵方面是了解它支持的所有數據類(lèi)型。
為什么數據類(lèi)型很重要?
錯誤的數據類(lèi)型會(huì )導致數據庫性能、查詢(xún)優(yōu)化和數據截斷等問(wèn)題。這些問(wèn)題通常是開(kāi)發(fā)團隊首先意識到的,因為它們是跟蹤速度和性能的問(wèn)題。盡管如此,問(wèn)題可能會(huì )蔓延到整個(gè)組織,導致數據完整性問(wèn)題和其他嚴重挑戰。 如果您是 SQL Server 的新手,那么數據類(lèi)型的絕對數量可能會(huì )讓人不知所措。
但是,它們組織得井井有條并且有據可查,只要您了解計劃存儲的數據類(lèi)型,就可以更容易地找到所需的內容。當然,雖然您可以隨時(shí)參考,但獲得 SQL Server 數據類(lèi)型的知識對于長(cháng)期的效率和優(yōu)化至關(guān)重要。深入研究后,您會(huì )發(fā)現存在一些重疊,并且只有在您完全了解所有選項的情況下,才能知道何時(shí)選擇浮點(diǎn)數而不是十進(jìn)制數或選擇可變長(cháng)度而不是固定值。
有哪些不同的數據類(lèi)別?
下面是 SQL Server 中每個(gè)數據類(lèi)別的概覽,以及適合每個(gè)數據類(lèi)型的所有數據類(lèi)型。
精確數字
使用精確的數字數據類(lèi)型時(shí),了解您的選項很重要,這樣您就可以選擇適合您的用例的最小數據類(lèi)型。還需要選擇與您存儲的數字類(lèi)型相對應的數據類(lèi)型,例如貨幣的貨幣或小貨幣。
- tinyint:最小的整數存儲類(lèi)型,能夠存儲 0 到 255 之間的數字。
- smallint:整數存儲類(lèi)型,大小為兩倍,最多 2 個(gè)字節。
- int:整數存儲類(lèi)型,最多存儲 4 個(gè)字節。
- bigint:最大的整數存儲類(lèi)型,最多可容納 8 個(gè)字節的數據。
- 十進(jìn)制和數字:這些同義詞指的是相同的數據類(lèi)型,其特點(diǎn)是其固定的小數位數和精度。
- bit:此數據類(lèi)型的值始終為 1、0 或 NULL。您可以將真/假數據轉換為位,其中 1 等于 True,0 等于 False。
- smallmoney:此數據類(lèi)型表示貨幣值,最多允許兩位小數。
- money:這是另一種貨幣數據類(lèi)型,但最多允許四位小數。
Unicode 字符串
如果您不熟悉 Unicode,它是一種通用標準,它為每個(gè)字符分配一個(gè)唯一編號,從而允許對書(shū)面文本進(jìn)行一致的編碼和表示。例如,Unicode 中的“嘿”將被分解如下:U+0048(“H”)、U+0065(“E”)和 U+0059(“Y”)。SQL Server 支持使用這些字符串的所有 Unicode 字符數據。它們可以是固定的或可變的。
- nchar:大小固定,推薦在列數據大小一致時(shí)使用。
- nvarchar:大小可變,建議在列中的數據大小變化很大時(shí)使用。
- ntext:計劃在 SQL Server 的未來(lái)版本中刪除,設計為 Unicode 的可變長(cháng)度數據類(lèi)型。Microsoft 建議改為使用 nvarchar(max)。
近似數值
當數值數據不能精確表示時(shí),它被稱(chēng)為“浮點(diǎn)”數值數據,您可以使用近似數數據類(lèi)型來(lái)存儲它。對于浮點(diǎn)數據類(lèi)型,數字使用科學(xué)計數法寫(xiě)入,因此 825,000 將存儲為 8.5 x 10 5。浮點(diǎn)數可以非常大或非常小。浮點(diǎn)數和十進(jìn)制數據類(lèi)型都可以存儲帶有小數的數字——不同之處在于浮點(diǎn)數需要更少的存儲空間,而小數則更精確。SQL Server 支持浮點(diǎn)數和實(shí)數數據類(lèi)型的兩種近似數值。
- float:雙精度浮點(diǎn)數,相當于 8 個(gè)字節或 64 位。
- real:?jiǎn)尉雀↑c(diǎn)數,相當于 4 個(gè)字節或 32 位。
字符串
字符串有一個(gè)不言自明的名稱(chēng):這些數據類(lèi)型用于存儲字符。它們的大小可以是固定的或可變的。
- char:使用靜態(tài)內存位置的固定大小的字符串數據。當您知道字符串的長(cháng)度并且列中的所有字符串都相同時(shí)是理想的。
- varchar:使用動(dòng)態(tài)內存位置的可變大小的字符串數據。如果您不確定字符串的長(cháng)度或列中字符串的長(cháng)度會(huì )有很大差異時(shí)使用。
- text:計劃在 SQL Server 的未來(lái)版本中刪除,設計為非 Unicode 數據的可變長(cháng)度數據類(lèi)型。Microsoft 建議將其替換為 varchar (max)。
二進(jìn)制字符串
二進(jìn)制數據類(lèi)型支持固定或可變的數據字符串。字符串和二進(jìn)制字符串之間的區別在于它們包含的數據:字符串通常存儲文本,但也可以存儲數字或符號。二進(jìn)制字符串通常以字節的形式存儲非傳統數據,例如圖片。
- binary:固定長(cháng)度,當列中的數據大小一致時(shí)非常適合使用。
- varbinary:當列中的數據大小變化很大時(shí),可變長(cháng)度是理想的。
- 圖片:計劃在 SQL Server 的未來(lái)版本中刪除,旨在存儲可變長(cháng)度的二進(jìn)制數據。Microsoft 建議將其替換為 varbinary (max)。
日期和時(shí)間
這些數據類(lèi)型明確設計用于存儲日期和時(shí)間。有些支持時(shí)區意識,有些則不支持。在處理日期和時(shí)間時(shí),選擇一種保持條目格式一致的數據類(lèi)型并選擇一種足夠靈活以支持您需要的詳細程度(即一天中的時(shí)間、時(shí)區等)的數據類(lèi)型至關(guān)重要。
- date:定義日期。默認格式為 YYYY-MM-DD,但可以采用 20 多種不同的方式進(jìn)行格式化,包括 DMY、DYM 和 YMD。
- datetimeoffset:定義日期和時(shí)間。此數據類(lèi)型可識別時(shí)區。 datetime2:上述數據類(lèi)型的擴展,具有可選的小數秒精度。
- datetime:與 datetime2 類(lèi)似,但小數秒精度較低。
- smalldatetime:定義日期和時(shí)間,但秒始終為零。
- time:定義一天中的某個(gè)時(shí)間,但不知道時(shí)區。
其他數據類(lèi)型
SQL Server 中存在其他數據類(lèi)型,但它們并不完全適合上述任何類(lèi)別。因此,這些數據類(lèi)型僅存在于“其他”下。其他數據類(lèi)型包括:
- rowversion:用于在表中標記行的版本。不保留日期或時(shí)間的簡(jiǎn)單遞增數字。
- ?hierarchyid:可變長(cháng)度系統數據類(lèi)型,用于表示層次結構中的位置。
- uniqueidentifier:能夠存儲多達 16 個(gè)字節的全局唯一標識符 (GUID)。
- sql_variant:存儲 SQL 支持的各種數據類(lèi)型。sql_variant 最重要的部分是它是可變的。例如,一個(gè) sql_variant 列可以在一行中包含一個(gè) int,而在另一行中包含一個(gè)二進(jìn)制值。為了應用算術(shù)運算,如 SUM 或 PRODUCT,必須首先將類(lèi)型轉換為與該運算一起使用的東西。
- xml:存儲 XML 數據。
- 空間幾何類(lèi)型:表示平面坐標系中的數據。
- 空間地理類(lèi)型:表示圓形地球坐標系中的數據。
- 表:用于存儲結果以供稍后處理的特殊數據類(lèi)型。
定義自定義數據類(lèi)型
如果您的自定義數據類(lèi)型在上述任何類(lèi)別中都不是特定的,您仍然可以將其帶到 SQL Server 上,只要您提前設置它。使用 Transact-SQL 或 Microsoft .NET Framework,開(kāi)發(fā)人員可以為他們的項目定義自定義數據類(lèi)型。
在創(chuàng )建自定義數據類(lèi)型時(shí),SQL Server 的界面有一些工具可以幫助您生成 Transact-SQL。您需要指定的字段包括架構、名稱(chēng)、基礎數據類(lèi)型、長(cháng)度、允許空值、字節大小、默認值中的可選字段以及數據類(lèi)型必須遵循的任何規則。例如,電子郵件字段可能會(huì )使用 varchar 基礎類(lèi)型,并且必須包含 @ 和 .,以及不允許使用的字符列表。然后,您將設置一個(gè)適合您需要的最大長(cháng)度,并且字節數將自動(dòng)填充到界面中。
如果您需要創(chuàng )建自己的數據類(lèi)型,Microsoft 會(huì )提供更多信息。
選擇正確的數據類(lèi)型
使用 SQL Server 時(shí),為正在使用的任何數據選擇正確的數據類(lèi)型至關(guān)重要。不這樣做可能會(huì )導致數據質(zhì)量問(wèn)題或數據丟失,例如在您使用數據類(lèi)型來(lái)存儲不打算這樣做的日期和時(shí)間的情況下。錯誤的數據類(lèi)型也會(huì )對??查詢(xún)和性能產(chǎn)生負面影響。
例如,如果您需要存儲整數,您可能會(huì )認為只需選擇精確的數字數據類(lèi)型就不會(huì )出錯。但是,不必要地使用 bigint 類(lèi)型來(lái)存儲像年齡這樣的小而簡(jiǎn)單的數字會(huì )導致資源浪費。
大多數人會(huì )告訴您在處理數字數據時(shí)從 smallint、integer、bigint 或 decimal 中進(jìn)行選擇。如果您正在處理非常大的數字,他們可能會(huì )建議 decfloat 或 float。但是,當您處理特定用例時(shí),此建議過(guò)于簡(jiǎn)單和籠統。