与 MySQL 的 utf8mb4 字符集等效的 SQL Server 是什么?

Mat*_*ias 7 sql-server migration collation character-set unicode

我们有一些基于数据库的 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是什么意思?

例如,特别是如果你有中文字符,这会如何表现?

Sol*_*zky 6

第一:SQL Server 的特定“版本”(即 Express、Standard、Enterprise 等)并不重要。特定版本的所有版本都将表现相同。

 

当我切换到“标准”时,它会选择Latin1_General_CI_AS排序规则。

嗯,这比以 开头的排序规则要好SQL_,但仍然不理想。如果您使用的是 SQL Server 2008 或更高版本,则应使用版本 100 排序规则(如果使用 SQL Server 2017 或更高版本指定日语排序规则,则应使用版本 140 排序规则)。并且,如果使用 SQL Server 2012 或更高版本,那么您应该使用支持增补字符的排序规则,这意味着您的选择是:

  • 名称以_SC, 或结尾的版本 100 排序规则
  • 版本 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 排序规则的相似之处在于所有增补字符都具有相同的权重,只是它们根本没有权重。
  • ciMySQL 排序规则中的the意味着ai“since”as未指定。

尽管如此,你还是想坚持:Latin1_General_100_CI_AI_SC

 

我不知道这是什么字符编码,也不知道如果我们想将utf7mb8MySQL 表中的一些数据转移到 SQL Server 中,它会如何影响场景。

编码由数据类型和排序规则的组合确定:

  • NVARCHAR(和NCHAR/ NTEXT)始终为UTF-16 LE (Little Endian)。
  • 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)中引入的,但底层数据并不是新的,它们只是为内置函数添加了对补充字符的支持。因此,版本90100排序规则存在这些结尾,但仅从 SQL Server 2012 开始。

  • 接下来,您具有灵敏度,可以是以下各项的任意组合,但始终按此顺序指定:
    • CS= 区分大小写或CI= 不区分大小写
    • AS= 区分重音或AI= 不区分重音
    • KS= 假名类型敏感或缺失 = 假名类型不敏感
    • WS= 宽度敏感或缺失 = 宽度不敏感
    • VSS= 变体选择器敏感(仅在版本 140 排序规则中可用)或缺失 = 变体选择器不敏感
  • 可选的最后一块:

    • _SC最后的意思是“补充字符支持”。“支持”仅影响内置函数如何解释代理对(即补充字符在 UTF-16 中的编码方式)。如果没有_SC在末尾(或_140_中间),内置函数看不到单个补充字符,而是看到组成代理对的两个无意义的代码点。此结尾可以添加到任何非二进制版本 90 或 100 排序规则中。
    • _BINor_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带排序规则的数据(列、变量、字符串文字)时,UTF-8 排序规则效果最佳_UTF8。对于任何使用它来实现兼容性的人来说,这是自然状态,但对于那些希望使用它来节省空间的人来说则不然。_UTF8将使用排序规则的 VARCHAR 数据与VARCHAR使用非_UTF8排序规则的数据或数据混合时要小心NVARCHAR,因为您可能会遇到奇怪的行为/数据丢失。有关新 UTF-8 排序规则的更多详细信息,请参阅:SQL Server 2019 中的本机 UTF-8 支持:救世主还是假先知?

 

例如,特别是如果您有汉字,这会如何表现?

  • 如果您将这些字符存储在VARCHAR列或变量中,那么当它们转换为?. 有一些中文区域设置排序规则使用双字节字符集 (DBCS),VARCHAR可以存储超过 256 个不同的字符,但它仍然与 Unicode 中可用的字符集相距甚远。
  • 如果将这些字符存储在NVARCHAR列或变量中,则不会丢失数据。但是,对于Latin1_General文化/语言环境(西欧/美国英语),您不会获得任何特定于中文的语言规则,因此中文字符的排序和比较(任何与默认定义中不同的内容)可能不会表现出来适合该语言。_SC在这种情况下,您只需在名称中使用中文排序规则、版本 100 和 with 即可。


Jay*_*zzo 0

我知道这已经很老了。但有类似的问题...

\n\n
But what does the collation Latin1_General_CI_AS mean, then?\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

每个排序规则名称中的其余代码(例如_CS_AI_WS_SC)指示排序规则上预配置的选项。例如,CI 表示不区分大小写,AS 表示区分重音。描述栏显示选项代码的含义。有关更多详细信息,请参阅 Microsoft 文章\xe2\x80\x9c 排序规则和 Unicode 支持。\xe2\x80\x9d ~ 从RedGate中提取

\n
\n\n

如果您需要直接从 Microsoft 获取有关您的问题的详细信息,请查看此内容。

\n\n

尽管没有其他MySQL选择,UTF8MB4您可以使用此处列出的表情符号。

\n\n

请查看“如何将 SQL Server Unicode / NVARCHAR 字符串设置为表情符号或补充字符?”以获取有关编码的非常详细的信息。

\n\n

以下是MSSQL 排序规则 2017的更多信息。

\n\n

最后,请阅读本文。因为这是从某个角度分解的历史的一个很好的版本。

\n