将 C# 字符串 (UTF-16) 存储在 SQL Server nvarchar (UCS-2) 列中会产生什么后果?

2024-04-07

SQL Server 似乎使用 UnicodeUCS-2,一个2字节的定长字符编码,对于nchar/nvarchar字段。同时,C# 使用 UnicodeUTF-16其字符串的编码(注意:有些人不认为 UCS-2 是 Unicode,但它在 Unicode 子集 0-0xFFFF 中对所有与 UTF-16 相同的代码点进行编码,就 SQL Server 而言,这是就字符串而言,它本身支持的最接近“Unicode”的东西。)

虽然 UCS-2 在基本多语言平面 (BMP) 中编码与 UTF-16 相同的基本代码点,但它没有保留 UTF-16 允许代理项对的某些位模式。

如果我将 C# 字符串写入 SQL Servernvarchar(UCS-2) 字段并读回,这总是返回相同的结果吗?

看起来,虽然 UTF-16 是 UCS-2 的超集,因为 UTF-16 编码了更多代码点(例如高于 0xFFFF),但它实际上是 UCS-2 在 2 字节级别的子集,因为它是更具限制性。

为了回答我自己的问题,我怀疑如果我的 C# 字符串包含高于 0xFFFF 的代码点(由字符对表示),这些代码点将在数据库中很好地存储和检索,但如果我尝试在数据库中操作它们(例如也许调用 TOUPPER 或尝试清空所有其他字符),那么我可能会在稍后显示字符串时遇到一些问题...除非 SQL Server 具有确认代理项对并有效处理的函数nchar/nvarchar字符串为 UTF-16。


这真的有点胡说八道。

首先是相似之处

  • SQL服务器nchar/nvarchar/ntext数据类型将文本存储为 2 字节字符的字符串。它并不真正关心您在其中放入什么,直到您进行搜索和排序(然后它使用适当的 Unicode 排序规则序列)。
  • The CLR String数据类型还将文本存储为 2 字节的字符串Chars。它也并不真正关心你在其中放入什么,直到你进行搜索和排序(然后它使用适当的特定于文化的方法)。

现在的差异

  • .NET 允许您通过以下方式访问 CLR 字符串中的实际 Unicode 代码点字符串信息 http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx class.
  • .NET 对以各种编码方式对文本数据进行编码和解码提供了大量支持。当将任意字节流转换为String,它总是将字符串编码为 UTF-16(具有完整的多语言平面支持)。

简而言之,只要将 CLR 和 SQL Server 字符串变量视为整个文本块,那么您可以自由地从一个分配到另一个,而不会丢失信息。尽管顶层的抽象略有不同,但底层存储格式完全相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 C# 字符串 (UTF-16) 存储在 SQL Server nvarchar (UCS-2) 列中会产生什么后果? 的相关文章

  • 通过 C# SqlCommand 执行合并语句不起作用

    我正在第一次尝试使用临时表和MERGE语句通过更新 SQL 表SqlCommandC 中的对象 我正在开发的程序旨在首先将大量记录 最多 20k 导出到 Excel 电子表格中 然后 用户可以搜索并替换特定值 并根据需要更新任意多记录中的任
  • 无法与重定向器建立连接。确保“sql browser”服务正在运行

    所以我尝试这个 sql server 2012 由于这个错误我无法打开任何 ssis 包 无法与重定向器建立连接 确保 sql browser 服务正在运行 我的 Sql 浏览器肯定正在运行 我尝试在本地服务 本地系统和网络下更改它 仍然没
  • 当附加触发器时,Linq-to-sql 插入和更新失败

    我最近在 linq to sql 方面遇到了一些问题 问题在于 当我们将触发器附加到事件时 它 认为 插入和更新失败 一个例子可以是一行 当一行被更改时 附加一个触发器将 LastUpdated 冒号设置为当前时间 这将导致 linq to
  • 如何向 SQL 连接字符串添加自定义属性?

    我想在 SqlServer 连接字符串中添加一些自定义属性 如下所示 Integrated Security SSPI Extended Properties SomeAttr SomeValue Persist Security Info
  • 使用 DISTINCT 进行查询需要很长时间

    我正在使用 Microsoft Access 2003 我的项目中的一个表单需要很长时间才能向用户显示 这是适用的查询 SELECT DISTINCT tb KonzeptDaten DFCC tb KonzeptDaten OBD Cod
  • 跳过行:将数据从 SSIS 导出到 Excel 文件

    我正在尝试使用 SSIS 将数据从 SQL Server 数据库导出到 Excel 文件中 我希望从第 6 行插入数据 第 5 行有标题 我可以映射标题名称Excel 目标编辑器 通过编写 SQL 命令到 SQL 表头 SELECT FRO
  • SQL存储过程执行时间差异

    我在 win form 应用程序中遇到奇怪的问题 我正在调用一个存储过程 并且执行大约需要 6 秒 此存储过程接受多个参数 包括一个输出参数 从应用程序级别我使用 Dim dt1 DateTime Now cmd ExecuteNonQue
  • 如何使用 php 在 sql 查询中转义引号?

    我有一个疑问 sql SELECT CustomerID FROM tblCustomer WHERE EmailAddress addslashes POST username AND Password addslashes POST p
  • 替换字符串中的多个字符,而不使用任何嵌套替换函数

    我的表中存储了一个方程 我一次获取一个方程 并希望将所有运算符替换为任何其他字符 输入字符串 N 100 6858 6858 N 100 0 2 N 35 运算符或模式 替换字符 输出字符串 N 100 6858 6858 N 100 0
  • 使用 PHP 将 latin1_swedish_ci 转换为 utf8

    我有一个数据库 里面充满了类似的值 Dhaka 应该是 Dhaka 因为我在创建数据库时没有指定排序规则 现在我想修复它 我无法从最初获取数据的地方再次获取数据 所以我在想是否可以在 php 脚本中获取数据并将其转换为正确的字符 我已将数据
  • 根据数据框中的内容从SQL Server删除行

    我在 SQL Server 中有一个名为的库存表dbo inventory其中包含Year Month Material and Stock quantity 我每天都会收到 csv 文件形式的新库存计数 需要将其加载到dbo invent
  • 如何将 SQL Server 中同一表中的一列插入到另一列中

    我需要将一列的数据插入到同一个表中的另一列中 谁能告诉我这个怎么写 Thanks UPDATE table SET col 2 col 1
  • 仅选择 Varchar 列中的数字[重复]

    这个问题在这里已经有答案了 在 SQL Server 2008 R2 中 我在 varchar 12 列中有一些数据 它看起来像这样 Data 1234 1765 34566 123 SDRMH HJG434 我想从所有包含 的行中删除 并
  • SQL Server:当列为 NTEXT 时 IN('asd') 不起作用

    我该如何解决这个问题 where someNtext IN asd asd1 给出错误 消息 402 第 16 层 状态 1 第 XXXXX 行数据类型 ntext 和 varchar 在等于运算符中不兼容 An INlist 只是 OR
  • SQL Server默认字符编码

    默认情况下 Microsoft SQL Server 中数据库的字符编码集是什么 如何查看 SQL Server 中当前的字符编码 编码 In most cases SQL Server stores Unicode data i e th
  • 如何在审计触发器中使用system_user但仍使用连接池?

    我想做以下两件事 在我的数据库表上使用审计触发器来识别哪个用户更新了什么 使用连接池来提高性能 对于 1 我在数据库触发器中使用 system user 来识别进行更改的用户 但这阻止我执行需要通用连接字符串的 2 有没有一种方法可以让我充
  • 作为 UDF 结果的列上的 Where 子句

    我有一个用户定义的函数 例如myUDF a b 返回一个整数 我试图确保该函数仅被调用一次 并且其结果可以用作WHERE clause SELECT col1 col2 col3 myUDF col1 col2 AS X From myTa
  • <表值函数> 不是可识别的内置函数名称

    我收到此错误 消息 195 第 15 级 状态 10 第 1 行 fnParseName 不是可识别的内置函数名称 对于这个查询 SELECT fnParseName DOCTORFIRSTNAME DOCTORLASTNAME FROM
  • 使用 SQL 扩展事件捕获链接服务器查询

    我尝试了许多事件类型 但无法实现链接服务器的日志记录 我可以找出所有其他数据库的事件 但对于链接服务器却没有运气 有什么建议 您可以使用OLEDB DATA READ跟踪对链接服务器的查询的事件 如果此事件的结果比您想要的更详细 您可能需要
  • 重新启动后无法远程或本地连接到 SQL Server

    上周末进行一些网络维护后 我们的开发服务器出现了一些问题 导致我们重新启动它 重新启动期间安装了一些更新 这可能是也可能不是一个因素 从那时起 我们就无法连接到 SQL Server 2005 即使是通过 Management Studio

随机推荐