Sql-Server

什麼是 MySQL 的 utf8mb4 字元集的 SQL Server 等效項?

  • April 23, 2020

我們有一些基於數據庫的 Web 應用程序,使用utf8mb4字元集和utf8mb4_Standard排序規則。

MYSQL

我們看到我們可以在此設置中使用我們想要的任何字元。

在 SQL Server Express 中,情況對我來說不是很清楚。

當我切換到Standard它時選擇Latin1_General_CI_AS排序規則。

但我不知道這是哪種字元編碼,如果我們想將utf7mb8MySQL 表中的一些數據轉移到 SQL Server 中,它將如何影響場景。

在此處輸入圖像描述

當我查看 SQL Server 中的數據類型定義時,我可以看到有 Unicode 和非 Unicode 類型。所以我想知道排序規則是否真的會影響它的儲存方式:

在此處輸入圖像描述

似乎如果您使用nchar,nvarchar或者nvarchar(max)您在使用 UTF-16 時是安全的。

但是,排序規則Latin1_General_CI_AS是什麼意思?

尤其是如果你有中文字元,這會如何表現?

首先:SQL Server 的特定“版本”(即 Express、Standard、Enterprise 等)無關緊要。特定版本的所有版本都將表現相同。

 

當我切換到“標準”時,它會選擇Latin1_General_CI_AS排序規則。

好吧,這比以 開頭的排序規則要好SQL_,但仍然不理想。如果您使用的是 SQL Server 2008 或更新版本,那麼您應該使用版本 100 排序規則(或者如果使用 SQL Server 2017 或更新版本指定日語排序規則,則使用版本 140 排序規則)。並且,如果使用 SQL Server 2012 或更高版本,那麼您應該使用支持補充字元的排序規則,這意味著您的選擇是:

  • 名稱以_SC, 或
  • 版本 140 排序規則(只有日語排序規則具有版本 140 集合,但_SC由於所有版本 140 排序規則都內置了補充字元支持,因此這些都沒有結束)

在您的情況下,您很可能想要:Latin1_General_100_CI_AI_SC

從技術上講,最接近的等價於utf8mb4_general_ci(沒有utf8mb4_Standard,你的螢幕截圖甚至顯示utf8mb4_general_ci)是Latin1_General_CI_AI. 原因是:

  • 字元集utf8mb4允許您儲存補充字元(NVARCHAR無論排序規則如何),
  • MySQL排序規則的general部分意味著補充字元都具有相同的權重。這種 100 級之前的 SQL Server 排序規則的相似之處在於所有補充字元都具有相同的權重,只是它們根本沒有權重。
  • MySQL 排序規則中的theci暗示了aisinceas未指定。

儘管如此,你還是想堅持:Latin1_General_100_CI_AI_SC.

 

我不知道這是哪種字元編碼,如果我們想將utf7mb8MySQL 表中的一些數據轉移到 SQL Server 中,它將如何影響場景。

編碼由數據類型和排序規則的組合確定:

  • NVARCHAR(和NCHAR/ NTEXT始終是UTF-16 LE(小端序)。
  • VARCHAR(和CHAR/ TEXT始終是 8 位編碼,具體編碼由與正在使用的排序規則關聯的程式碼頁確定。

也就是說,只要目標編碼可以處理所有傳入的字元(並且以類似的方式表現,當然,這就是文化和敏感性的來源),源編碼是什麼並不重要。假設您將儲存所有內容NVARCHAR(可能偶爾NCHAR,但從NTEXTSQL Server 2005 以來已被棄用),那麼數據傳輸工具將處理任何必要的轉換。

 

校對Latin1_General_CI_AS是什麼意思?

它的意思是:

  • 因為名稱不以 開頭SQL_,所以這是一個 Windows 排序規則,而不是 SQL Server 排序規則(這是一件好事,因為 SQL Server 排序規則——那些以開頭的SQL_——主要是為了兼容 SQL Server 2000 之前的版本,儘管很不幸SQL_Latin1_General_CP1_CI_AS的是非常常見,因為它是在使用美國英語作為其語言的作業系統上安裝時的預設設置)

  • Latin1_General是文化/語言環境。

    • 對於NVARCHAR數據,這決定了用於排序和比較的語言規則。

    • 對於VARCHAR數據,這決定了:

      • 用於排序和比較的語言規則。
      • 用於對字元進行編碼的程式碼頁。例如,Latin1_General歸類使用程式碼頁 1252,Hebrew歸類使用程式碼頁 1255,依此類推。
  • {version},雖然不在此排序規則名稱中,但指的是引入排序規則的 SQL Server 版本(大部分情況下)。名稱中沒有版本號的 Windows 排序規則是版本80(表示 SQL Server 2000,即版本 8.0)。並非所有版本的 SQL Server 都帶有新的排序規則,因此版本號存在差距。有一些90(對於 SQL Server 2005,版本 9.0),大多數是100(對於 SQL Server 2008,版本 10.0),還有一小部分有140(對於 SQL Server 2017,版本 14.0)。

我說“大部分”是因為以 結尾的排序規則_SC是在 SQL Server 2012(版本 11.0)中引入的,但底層數據並不是新的,它們只是為內置函式添加了對補充字元的支持。因此,版本90100排序規則存在這些結尾,但僅從 SQL Server 2012 開始。

  • 接下來是敏感度,可以是以下任意組合,但始終按此順序指定:

    • CS= 區分大小寫或CI= 不區分大小寫
    • AS= 重音敏感或AI= 重音不敏感
    • KS= 假名類型敏感或缺失 = 假名類型不敏感
    • WS= 寬度敏感或缺失 = 寬度不敏感
    • VSS= 變體選擇器敏感(僅在版本 140 排序規則中可用)或缺失 = 變體選擇器不敏感
  • 可選的最後一塊:

    • _SC最後的意思是“補充字元支持”。“支持”僅影響內置函式如何解釋代理項對(即補充字元在 UTF-16 中的編碼方式)。沒有_SC在末尾(或_140_中間),內置函式看不到單個補充字元,而是看到組成代理對的兩個無意義的程式碼點。可以將此結尾添加到任何非二進製版本 90 或 100 排序規則中。
    • _BIN_BIN2最後表示“二進制”排序和比較。數據仍然以相同的方式儲存,但沒有語言規則。這個結局永遠不會與 5 種敏感性中的任何一種或_SC. _BIN是較舊的樣式,並且_BIN2是更新,更準確的樣式。如果使用 SQL Server 2005 或更高版本,請使用_BIN2. 有關 和 之間的差異的詳細資訊_BIN_BIN2請參閱:各種二進制排序規則(文化、版本和 BIN 與 BIN2)之間的差異
    • _UTF8是自 SQL Server 2019 起的一個新選項。它是一種 8 位編碼,允許將 Unicode 數據儲存在數據類型VARCHARCHAR(但不支持已棄用的TEXT數據類型)。此選項只能用於支持補充字元的排序規則(即_SC名稱中包含 90 或 100 版排序規則,以及 140 版排序規則)。還有一個二進制_UTF8排序規則(_BIN2, not _BIN)。

    請注意: UTF-8 的設計/創建是為了與為 8 位編碼設置但希望支持 Unicode 的環境/程式碼兼容。儘管與 UTF-8 相比,在少數情況下 UTF-8 可以節省高達 50% 的空間NVARCHAR,但這只是一種副作用,並且在許多/大多數操作中都會對性能造成輕微影響。如果您需要它以實現兼容性,那麼成本是可以接受的。如果你想節省空間,你最好測試一下,然後再測試一次。測試包括所有功能,而不僅僅是幾行數據。請注意,當所有列和數據庫本身都使用VARCHAR帶有_UTF8整理。對於任何使用它來實現兼容性的人來說,這是自然狀態,但對於那些希望使用它來節省空間的人來說卻不是。_UTF8將使用排序規則的 VARCHAR 數據與VARCHAR使用非_UTF8排序規則的數據或數據混合時要小心NVARCHAR,因為您可能會遇到奇怪的行為/數據失去。有關新 UTF-8 排序規則的更多詳細資訊,請參閱:SQL Server 2019 中的原生 UTF-8 支持:Savior 還是 False Prophet?

 

尤其是如果你有中文字元,這會如何表現?

  • 如果您將這些字元儲存在VARCHAR列或變數中,那麼當它們轉換為?. 有一些中文語言環境排序規則使用雙字節字元集 (DBCS),因為VARCHAR它可以儲存超過 256 個不同的字元,但它仍然與 Unicode 中可用的內容相去甚遠。
  • 如果您將這些字元儲存在NVARCHAR列或變數中,則不會失去數據。但是,對於Latin1_General文化/區域設置(西歐/美國英語),您不會獲得任何特定於中文的語言規則,因此對中文字元(與預設定義不同的任何內容)的排序和比較可能不會起作用適合該語言。在這種情況下,您只需使用中文排序規則,版本 100,並_SC在名稱中添加 with。

我知道這已經很老了。但有類似的問題……

But what does the collation Latin1_General_CI_AS mean, then?

每個排序規則名稱中的剩餘程式碼(例如 _CS_AI_WS_SC)表示排序規則上預配置的選項。例如,CI 表示不區分大小寫,AS 表示區分重音。描述列顯示選項程式碼的含義。有關更多詳細資訊,請參閱 Microsoft 文章“排序規則和 Unicode 支持”。~ 從RedGate中提取

如果您需要直接從 Microsoft 獲得有關您的問題的詳細資訊,請查看此資訊。

儘管您沒有MySQL其他選擇,UTF8MB4但您可以使用此處列出的表情符號。

請查看“如何將 SQL Server Unicode / NVARCHAR 字元串設置為表情符號或補充字元?” 有關編碼的非常詳細的資訊。

這是MSSQL Collat​​ions 2017 的更多資訊。

**最後,請閱讀本文。**因為從一個角度來看,這是一個很好的歷史版本。

引用自:https://dba.stackexchange.com/questions/72566