Mat*_*ias 7 sql-server migration collation character-set unicode
我们有一些基于数据库的 Web 应用程序,它们utf8mb4用作字符集和utf8mb4_Standard排序规则。

我们看到我们可以在这个设置中使用我们想要的任何字符。
在 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, 或结尾的版本 100 排序规则_SC因为所有版本 140 排序规则中都内置了增补字符支持)就您而言,您很可能想要:Latin1_General_100_CI_AI_SC
从技术上讲,最接近的等效项utf8mb4_general_ci(没有utf8mb4_Standard,并且您的屏幕截图甚至显示utf8mb4_general_ci)是Latin1_General_CI_AI。原因是:
utf8mb4集允许您存储补充字符(NVARCHAR无论排序规则如何),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)中引入的,但底层数据并不是新的,它们只是为内置函数添加了对补充字符的支持。因此,版本90和100排序规则存在这些结尾,但仅从 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 数据存储在VARCHAR和CHAR数据类型(但不支持已弃用的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 即可。我知道这已经很老了。但有类似的问题...
\n\nBut what does the collation Latin1_General_CI_AS mean, then?\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n每个排序规则名称中的其余代码(例如_CS_AI_WS_SC)指示排序规则上预配置的选项。例如,CI 表示不区分大小写,AS 表示区分重音。描述栏显示选项代码的含义。有关更多详细信息,请参阅 Microsoft 文章\xe2\x80\x9c 排序规则和 Unicode 支持。\xe2\x80\x9d ~ 从RedGate中提取
\n
如果您需要直接从 Microsoft 获取有关您的问题的详细信息,请查看此内容。
\n\n尽管没有其他MySQL选择,UTF8MB4您可以使用此处列出的表情符号。
请查看“如何将 SQL Server Unicode / NVARCHAR 字符串设置为表情符号或补充字符?”以获取有关编码的非常详细的信息。
\n\n以下是MSSQL 排序规则 2017的更多信息。
\n\n最后,请阅读本文。因为这是从某个角度分解的历史的一个很好的版本。
\n| 归档时间: |
|
| 查看次数: |
5820 次 |
| 最近记录: |