gpt4 book ai didi

sql-server - UCS-2和SQL Server

转载 作者:行者123 更新时间:2023-12-02 22:24:39 26 4
gpt4 key购买 nike

虽然researching options用于在可能很大的SQL Server数据库中存储大多数英语但有时不是的数据,但我倾向于将大多数字符串数据存储为UTF-8编码。

但是,Microsoft之所以选择UCS-2,是因为我不完全了解,这导致我对此有所怀疑。 SQL Server 2012的文档确实显示了如何创建UTF-8 UDT,但是UCS-2的决定大概遍及了SQL Server。

Wikipedia(有趣的是,注意到UCS-2已过时,而不再支持UTF-16)。注意到,UTF-8是可变宽度的字符集,能够对任何Unicode数据点进行编码,并且它是provides the de facto standard encoding for interchange of Unicode text。因此,感觉任何Unicode字符都可以用UTF-8表示,并且由于大多数文本将是英语,因此表示的紧凑程度几乎是UCS-2的两倍(我知道磁盘是“便宜的”,但磁盘缓存不是)不会,而且内存与我正在处理的数据大小相比也没有。当工作集大于可用的RAM时,许多操作都会成倍下降。

畅游UCS-2流会遇到什么问题?

最佳答案

storing mostly-English-but-sometimes-not data in a SQL Server database that can potentially be quite large, I'm leaning toward storing most string data as UTF-8 encoded.



与其他一些RDBMS允许选择编码的RDBMS不同,SQL Server仅以UTF-16(Little Endian)形式存储Unicode数据,而以8位编码(扩展的ASCII,DBCS或EBCDIC)的形式存储非Unicode数据。由字段的排序规则隐含。

Microsoft chose UCS-2 for reasons that I don't fully understand



考虑到UTF-16是在1996年中期引入并在2000年完全指定的,他们选择UCS-2的决定就足够了。许多其他系统也使用(或使用)它(请参阅: https://en.wikipedia.org/wiki/UTF-16#Usage)。他们决定继续执行此决定的过程可能更令人质疑,尽管这可能是由于Windows和.NET为UTF-16所致。字节的物理布局在UCS-2和UTF-16之间是相同的,因此从UCS-2升级系统以支持UTF-16应该纯粹是功能正常的,不需要更改任何现有数据。

The documentation for SQL Server 2012 does show how to create a UTF-8 UDT,



不。无论如何,通过SQLCLR创建自定义的用户定义类型都不会让您替换任何 native 类型。创建某些东西来处理专用数据非常方便。但是,即使是不同编码的字符串也远非特化。采用这种方式处理字符串数据将破坏系统的任何可用性,更不用说性能,因为您将无法使用任何内置的字符串函数。如果您能够在磁盘空间上节省任何东西,那么这些 yield 将被整体性能上的损失所抵消。通过将UDT序列化为 VARBINARY来存储它。因此,为了进行任何字符串比较或排序,在“二进制”/“常规”比较之外,您必须将所有其他值一一转换回UTF-8,然后再进行可以考虑的字符串比较语言差异。

而且,“文档”实际上只是示例代码/概念证明之类的东西。该代码是在2003年( http://msftengprodsamples.codeplex.com/SourceControl/latest#Kilimanjaro_Trunk/Programmability/CLR/UTF8String/CS/UTF8String/Utf8String.cs)针对SQL Server 2005编写的。我看到了用于测试功能的脚本,但没有涉及性能的脚本。

but the decision for UCS-2 presumably pervades SQL Server.



是的,非常非常。默认情况下,内置函数的处理仅适用于UCS-2。但是从SQL Server 2012开始,您可以使用下列排序规则之一来让它们处理完整的UTF-16字符集(以及Unicode版本5或6,具体取决于您的操作系统和.NET Framework版本)。名称以 _SC结尾(即补充字符)。

Wikipedia ... notes that UCS-2 is obsolete in favor of UTF-16



正确的。 UTF-16和UCS-2都使用2字节代码点。但是UTF-16会成对使用(即代理对)来映射其他字符。用于这些对的代码点为此在UCS-2中保留,因此不用于映射到任何可用的符号。这就是为什么您可以在SQL Server中存储任何Unicode字符,并且可以正确存储和检索它的原因。

Wikipedia ... notes that UTF-8 is a variable-width character set capable of encoding any Unicode data point



正确,尽管具有误导性。是的,UTF-8是可变宽度的,但是UTF-16也是次要可变的,因为所有的补充字符都由两个双字节代码点组成。因此,尽管UCS-2始终为2个字节,但UTF-16每个符号使用2个或4个字节。但这不是误导部分。令人误解的是,任何其他Unicode编码都无法对所有其他代码点进行编码。尽管UCS-2可以保留它们但不能解释它们,但UTF-16和UTF-32都可以映射所有Unicode代码点,就像UTF-8一样。

and that it [ed: UTF-8] provides the de facto standard encoding for interchange of Unicode text.



这可能是正确的,但从操作角度来看完全不相关。

it feels like any Unicode character can be represented in UTF-8



同样,这是正确的,但完全无关紧要,因为UTF-16和UTF-32也映射了所有Unicode代码点。

since most text will be English, the representation will be nearly twice as compact as with UCS-2



视情况而定,这很可能是正确的,并且担心这种浪费的使用是正确的。但是,正如我在导致这一问题的问题( UTF-8 Support, SQL Server 2012 and the UTF8String UDT)中提到的那样,如果大多数行都可以放入 VARCHAR中,但有一些需要成为 NVARCHAR,则您有几种选择来减少浪费的空间。最好的选择是启用ROW COMPRESSION或PAGE COMPRESSION(仅限Enterprise Editon!)。从SQL Server 2008 R2开始,它们允许非MAX NVARCHAR字段使用至少与UTF-8一样好的“Unicode标准压缩方案”,在某些情况下甚至比UTF-8更好。 NVARCHAR(MAX)字段不能使用这种花式压缩,但是它们的IN ROW数据可以从常规ROW和/或PAGE压缩中受益。请参见以下内容,以了解对此压缩的说明以及比较以下数据大小的图表:启用了数据压缩的原始UCS-2/UTF-16,UTF-8和UCS-2/UTF-16。

SQL Server 2008 R2 - UCS2 compression what is it - Impact on SAP systems

另请参阅 Data Compression的MSDN页面以获取更多详细信息,因为存在一些限制(除了仅在Enterprise Edition中可用-BUT允许从SQL Server 2016 SP1开始的所有版本都可以使用!)以及某些情况下可能进行压缩情况更糟。

I know disk is "cheap"



该语句的准确性取决于如何定义“磁盘”。如果您说的是商品零件,可以在商店购买以在台式机/笔记本电脑中使用。但是,如果说到将用于生产系统的企业级存储,那么请向控制预算的人解释一下,他们不应拒绝您想要的百万美元以上的SAN,因为这很“便宜”,这很有趣。 “;-)。

What problems might I encounter by swimming up the UCS-2 stream?



我没有想到的。好吧,只要您不遵循任何可怕的建议就可以执行诸如实现该UDT或将所有字符串转换为 VARBINARY或对所有字符串字段使用 NVARCHAR(MAX) ;-)。但是在所有您可能担心的事情中,使用UCS-2/UTF-16的SQL Server不应该是其中之一。

但是,如果由于某种原因这个对UTF-8不提供 native 支持的问题非常重要,那么您可能需要找到另一个允许UTF-8使用的RDBMS。

更新2018-10-02

尽管这不是一个可行的选择,但SQL Server 2019在 VARCHAR/ CHAR数据类型中引入了对UTF-8的 native 支持。当前有太多的错误需要使用,但是,如果它们已修复,则在某些情况下是一种选择。请参阅我的文章“ Native UTF-8 Support in SQL Server 2019: Savior or False Prophet?”,以详细了解此新功能。

关于sql-server - UCS-2和SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9008043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com