<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SQL Server中的VARCHAR和NVARCHAR數據類型

哲想軟件 ? 來源:哲想軟件 ? 2023-04-10 09:57 ? 次閱讀

關系數據庫在表中表示組織的數據,這些表使用具有不同數據類型的列,允許它們存儲有效值。開發人員和DBA需要知道并理解每一列的適當數據類型,以獲得更好的查詢性能。

本文將討論流行的數據類型VARCHAR()和NVARCHAR()、它們的比較以及SQLServer 中的性能評估。

SQL中的VARCHAR[ ( n | max ) ]

該VARCHAR數據類型表示非Unicode可變長度的字符串的數據類型。您可以在其中存儲字母、數字和特殊字符。

N表示以字節為單位的字符串大小。

VARCHAR數據類型列最多可存儲8000個非Unicode字符。

VARCHAR數據類型每個字符占用1個字節。如果您沒有明確指定N的值,則它需要1個字節的存儲空間。

注意:不要將N與表示字符串中字符數的值混淆。

以下查詢使用100個字節的數據定義VARCHAR數據類型。

58c648ce-d73a-11ed-bfe3-dac502259ad0.png

它返回長度為17,因為每個字符1個字節,包括一個空格字符。

58dda06e-d73a-11ed-bfe3-dac502259ad0.png

以下查詢定義了沒有任何N值的VARCHAR數據類型。因此,SQLServer 將默認值視為1個字節,如下所示。

59083acc-d73a-11ed-bfe3-dac502259ad0.png

我們還可以通過CAST或CONVERT函數使用VARCHAR。例如,在下面的兩個示例中,我們聲明了一個長度為100字節的變量,然后使用了CAST運算符。

第一個查詢返回長度為30,因為我們沒有在CAST運算符VARCHAR數據類型中指定N。默認長度為30。

5928caee-d73a-11ed-bfe3-dac502259ad0.png

但是,如果字符串長度小于30,則取字符串的實際大小。

594d2704-d73a-11ed-bfe3-dac502259ad0.png

SQL中的NVARCHAR[ ( n | max ) ]

所述NVARCHAR數據類型是用于Unicode的可變長度的字符數據類型。這里,N指的是國家語言字符集,用于定義Unicode字符串。您可以存儲非Unicode和Unicode字符(日語漢字、韓文等)。

N表示以字節為單位的字符串大小。

它最多可以存儲4000個Unicode和非Unicode字符。

VARCHAR數據類型每個字符占用2個字節。如果不為N指定任何值,則需要2個字節的存儲空間。

以下查詢使用100個字節的數據定義VARCHAR數據類型。

596eeb64-d73a-11ed-bfe3-dac502259ad0.png

它返回36的字符串長度,因為NVARCHAR每個字符存儲占用2個字節。

59874df8-d73a-11ed-bfe3-dac502259ad0.png

與VARCHAR數據類型類似,NVARCHAR也有1個字符(2個字節)的默認值,而沒有為N指定顯式值。

59b0ed20-d73a-11ed-bfe3-dac502259ad0.png

如果我們使用CAST或CONVERT函數應用NVARCHAR轉換而沒有任何顯式N值,則默認值為30個字符,即60個字節。

59d50142-d73a-11ed-bfe3-dac502259ad0.png

以VARCHAR數據類型存儲Unicode和非Unicode值

假設我們有一個表,記錄來自電子購物門戶的客戶反饋。為此,我們有一個包含以下查詢的SQL表。

59fbf180-d73a-11ed-bfe3-dac502259ad0.png

我們在這個表中插入幾個英語、日語和印地語的示例記錄。[Comment]的數據類型是VARCHAR,[NewComment]是NVARCHAR()。

5a158a1e-d73a-11ed-bfe3-dac502259ad0.png

查詢成功執行,并在從中選擇一個值時給出以下行。對于第二和第三行,如果數據不是英語的,它就不能識別數據。

5a3443f0-d73a-11ed-bfe3-dac502259ad0.png

VARCHAR和NVARCHAR數據類型:性能比較

我們不應在JOIN或WHERE謂詞中混合使用VARCHAR和NVARCHAR數據類型。它使現有索引無效,因為SQLServer 要求JOIN兩側的數據類型相同。如果不匹配,SQLServer 會嘗試使用CONVERT_IMPLICIT()函數進行隱式轉換。

SQLServer 使用數據類型優先級來確定目標數據類型。NVARCHAR的優先級高于VARCHAR數據類型。因此,在數據類型轉換期間,SQLServer 會將現有的VARCHAR值轉換為NVARCHAR。

5a5a8498-d73a-11ed-bfe3-dac502259ad0.png

現在,讓我們執行兩個SELECT語句,根據它們的數據類型檢索記錄。

5a74aae4-d73a-11ed-bfe3-dac502259ad0.png

這兩個查詢都使用索引查找運算符和我們之前定義的索引。

5a8d0472-d73a-11ed-bfe3-dac502259ad0.png

現在,我們切換數據類型值以與WHERE謂詞進行比較。第1列具有VARCHAR數據類型,但我們指定N'A'將其作為NVARCHAR數據類型。

類似地,col2是NVARCHAR數據類型,我們指定了引用VARCHAR數據類型的值“C”。

5aba63fe-d73a-11ed-bfe3-dac502259ad0.png

在查詢實際執行計劃中,您得到一個索引掃描,SELECT語句有一個警告符號。

5acedb86-d73a-11ed-bfe3-dac502259ad0.png

此查詢工作正常,因為NVARCHAR()數據類型可以同時具有Unicode和非Unicode值。

現在,第二個查詢使用索引掃描并在SELECT運算符上發出警告符號。

5af21b82-d73a-11ed-bfe3-dac502259ad0.png

將鼠標懸停在發出有關隱式轉換的警告的SELECT語句上。SQLServer 無法正確使用現有索引。這是由于VARCHAR和NVARCHAR數據類型的數據排序算法不同。

如果表有數百萬行,SQLServer必須做額外的工作并使用隱式數據轉換來轉換數據。它可能會對您的查詢性能產生負面影響。因此,在優化查詢時應避免混合和匹配這些數據類型。

5b125dca-d73a-11ed-bfe3-dac502259ad0.png

結論

您應該在適當地設計數據庫表及其列數據類型時查看您的數據要求。通常,VARCHAR數據類型可以滿足您的大部分數據需求。但是,如果需要在列中同時存儲Unicode和非Unicode數據類型,則可以考慮使用NVARCHAR。但是,在做出最終決定之前,您應該查看其性能影響、存儲大小。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3607

    瀏覽量

    63503
  • 函數
    +關注

    關注

    3

    文章

    4067

    瀏覽量

    61397
  • 數據類型
    +關注

    關注

    0

    文章

    229

    瀏覽量

    13529

原文標題:SQL Server 中的VARCHAR和NVARCHAR數據類型

文章出處:【微信號:哲想軟件,微信公眾號:哲想軟件】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    plc數據類型怎么理解和應用

    PLC(可編程邏輯控制器)是一種工業自動化設備,用于控制機械和工業過程。在PLC編程中,數據類型是非常重要的概念,因為它決定了程序中數據的存儲和處理方式。正確理解和應用PLC數據類型是編寫有效、可靠
    的頭像 發表于 12-19 11:39 ?1822次閱讀

    oracle的數據類型有哪些

    Oracle數據庫中有許多數據類型可供選擇,每種數據類型都有其各自的特點和適用場景。下面是對Oracle數據庫中最常用的數據類型的詳盡說明,
    的頭像 發表于 12-05 16:45 ?797次閱讀

    SQL Server數據庫備份方法

    了解數據備份類型: 在進行數據庫備份之前,首先需要了解數據備份的類型。SQL
    的頭像 發表于 11-23 14:27 ?854次閱讀

    mysql和sql server區別

    MySQL和SQL Server是兩種常見的關系型數據庫管理系統(RDBMS),用于存儲和管理數據庫。雖然它們都支持SQL語言,但在其他方面
    的頭像 發表于 11-21 11:07 ?895次閱讀

    CLOB類型數據轉換為VARCHAR類型

    數據庫中,CLOB(Character Large Object)和VARCHAR(Variable Character)都是用來存儲字符類型數據的字段。CLOB字段適用于存儲大量的
    的頭像 發表于 11-21 10:39 ?2384次閱讀

    clob類型varchar方法

    CLOB類型VARCHAR類型數據庫中常用的數據類型,用于存儲可變長度的字符數據。CLOB
    的頭像 發表于 11-21 10:33 ?3326次閱讀

    人大金倉三大兼容:SQL Server遷移無憂

    SQL Server數據庫領域一直占據著重要地位。作為一款成熟穩定的關系型數據庫管理系統,SQL Se
    的頭像 發表于 11-06 17:35 ?371次閱讀
    人大金倉三大兼容:<b class='flag-5'>SQL</b> <b class='flag-5'>Server</b>遷移無憂

    Redis的數據類型有哪些

    Redis的數據類型有哪些?有五種常用數據類型:String、Hash、Set、List、SortedSet。以及三種特殊的數據類型:Bitmap、HyperLogLog、Geospatial
    的頭像 發表于 10-09 10:51 ?433次閱讀

    數據數據恢復-SQL SERVER數據庫MDF (NDF)或LDF損壞的數據恢復方案

    SQL SERVER數據庫故障類型SQL SERVER
    的頭像 發表于 09-20 15:00 ?546次閱讀

    PLC 數據類型 (UDT) 的基本知識

    說明 PLC 數據類型 (UDT) 是一種復雜的用戶自定義數據類型,用于聲明一個變量。這種數據類型是一個由多個不同數據類型元素組成的數據結構
    的頭像 發表于 09-10 09:46 ?2830次閱讀
    PLC <b class='flag-5'>數據類型</b> (UDT) 的基本知識

    F型PLC數據類型與標準PLC數據類型(UDT)之間的差別在哪?

    可以像使用標準 PLC 數據類型 (UDT) 那樣,聲明和使用 F 型 PLC 數據類型 (UDT) ??梢栽诎踩绦蛑幸约皹藴视脩舫绦蛑惺褂?F 型 PLC 數據類型 (UDT) 。
    的頭像 發表于 08-27 09:54 ?788次閱讀
    F型PLC<b class='flag-5'>數據類型</b>與標準PLC<b class='flag-5'>數據類型</b>(UDT)之間的差別在哪?

    淺談PLC定義數據類型的應用

    PLC定義數據類型以下用一個例子介紹PLC定義數據類型的應用,以便進一步理解PLC定義數據類型。
    的頭像 發表于 07-24 16:07 ?883次閱讀
    淺談PLC定義<b class='flag-5'>數據類型</b>的應用

    ARRAY 數據類型的變量

    要求 全局數據塊已打開。 操作步驟 要聲明一個 ARRAY 數據類型的變量,請按以下步驟操作: 在“名稱”(Name) 列中,輸入變量的名稱。 在“數據類型”列中輸入“Array”數據類型
    的頭像 發表于 07-06 11:08 ?695次閱讀

    基本數據類型分享

    基本數據類型 基本數據類型:包括位、位序列、整數、浮點數、日期時間。此外字符也屬于基本數據類型,請參見文檔String與WString。 1.位和位序列 2.整數數據類型 3.浮點型實
    的頭像 發表于 06-13 14:14 ?6214次閱讀
    基本<b class='flag-5'>數據類型</b>分享

    GaussDB 數據類型介紹

    GaussDB 數據庫 GaussDB 是華為基于 openGauss 自研生態推出的云化企業級分布式關系型數據庫,它支持多種數據類型,包括數值、字符、日期等。在使用 GaussDB 時,可能需要
    的頭像 發表于 06-05 16:40 ?1305次閱讀
    GaussDB <b class='flag-5'>數據類型</b>介紹
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>