什麼是 MySQL 的 utf8mb4 字元集的 SQL Server 等效項?
我們有一些基於數據庫的 Web 應用程序,使用
utf8mb4
字元集和utf8mb4_Standard
排序規則。我們看到我們可以在此設置中使用我們想要的任何字元。
在 SQL Server Express 中,情況對我來說不是很清楚。
當我切換到
Standard
它時選擇Latin1_General_CI_AS
排序規則。但我不知道這是哪種字元編碼,如果我們想將
utf7mb8
MySQL 表中的一些數據轉移到 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 排序規則中的the
ci
暗示了ai
sinceas
未指定。儘管如此,你還是想堅持:
Latin1_General_100_CI_AI_SC
.
我不知道這是哪種字元編碼,如果我們想將
utf7mb8
MySQL 表中的一些數據轉移到 SQL Server 中,它將如何影響場景。編碼由數據類型和排序規則的組合確定:
NVARCHAR
(和NCHAR
/NTEXT
)始終是UTF-16 LE(小端序)。VARCHAR
(和CHAR
/TEXT
)始終是 8 位編碼,具體編碼由與正在使用的排序規則關聯的程式碼頁確定。也就是說,只要目標編碼可以處理所有傳入的字元(並且以類似的方式表現,當然,這就是文化和敏感性的來源),源編碼是什麼並不重要。假設您將儲存所有內容
NVARCHAR
(可能偶爾NCHAR
,但從NTEXT
SQL 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)中引入的,但底層數據並不是新的,它們只是為內置函式添加了對補充字元的支持。因此,版本90
和100
排序規則存在這些結尾,但僅從 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 數據儲存在數據類型VARCHAR
中CHAR
(但不支持已棄用的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 Collations 2017 的更多資訊。
**最後,請閱讀本文。**因為從一個角度來看,這是一個很好的歷史版本。