Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MS SQL中nvarchar(max)和nvarchar(4000)之间的unicode结果不同_C#_Sql Server - Fatal编程技术网

C# MS SQL中nvarchar(max)和nvarchar(4000)之间的unicode结果不同

C# MS SQL中nvarchar(max)和nvarchar(4000)之间的unicode结果不同,c#,sql-server,C#,Sql Server,当将列的类型从NVARCHAR(MAX)更改为NVARCHAR(4000)时,我在我的MS-SQL(14.0)数据库中发现了一种奇怪的unicode处理行为,我不知道是什么导致了这种行为 表(数据库排序规则:Latin1\u General\u 100\u CI\u AS): 首先,我手动将粘贴到“Text”f中�V“(f\ue48a\udc0bV),使用SQL Management Studio的“编辑前200行”(不问为什么…) 然后我更改了列的类型: ALTER TABLE Test

当将列的类型从NVARCHAR(MAX)更改为NVARCHAR(4000)时,我在我的MS-SQL(14.0)数据库中发现了一种奇怪的unicode处理行为,我不知道是什么导致了这种行为

表(数据库排序规则:Latin1\u General\u 100\u CI\u AS):

首先,我手动粘贴到“Text”f中�V“(f\ue48a\udc0bV),使用SQL Management Studio的“编辑前200行”(不问为什么…)

然后我更改了列的类型:

ALTER TABLE Test
ALTER COLUMN Test nvarchar(4000)

如您所见,第二个unicode字符的显示方式不同。 当将类型更改回nvarchar(max)等时,可以反转此行为

实际的问题是,当我通过EntityFramework在C#应用程序中加载该条目时,结果字符串将在nvarchar(max)中读取“f\ue48a\udc0bfV”,但在�V“如果是nvarchar(4000),则前者在写入流时会导致异常

有人知道真正的区别是什么,为什么会有这样的区别吗

提前谢谢

编辑: 这并不能解决我的问题,但unicode处理的差异可能来自存储在LOB中的NVARCHAR(MAX)值,而不是存储在行存储中的NVARCHAR(4000)值

Edit2:
只是补充一下,我已经按照提议提交了。

没有,没有区别。文本一开始就被弄乱了。你发布的不是Unicode,而是不可表示的字节。本页和您自己的帖子证明了SQL Server没有问题-StackOverflow是一个ASP.NET站点,它使用nvarchar列在SQL Server中存储Unicode数据。事实上,
是尝试使用错误的代码页读取单字节文本时使用的。某些字体可能没有该字符,而是显示一个空方块。其他驱动程序将坏数据替换为
。在任何情况下,数据在粘贴到网格中的那一刻就丢失了它只是用来显示结果的工具,而不是实际的字符。用于显示的编码使字符看起来不同。将字符0x00编码为0x7F时,所有字符看起来都一样。字符0x80到0xFF映射到不同的unicode字符,但是是一个字节而不是两个字节。字节值仍然是0x80到0xFF,但编码只是以不同的方式显示字符。这是ADO.NET客户端问题,而不是SQL Server问题。您可以通过执行
选择CONVERT(VARBINARY(MAX),…)
来验证列内容是否保持不变,并使用TDS返回数据包上的数据包嗅探器进一步验证字节是否保持不变。两列返回的结果完全相同,唯一的区别是元数据。显然,对于
NVARCHAR(MAX)
来说,它只是复制字节,而
NVARCHAR(4000)
则要经过解码步骤,过滤掉无效的UTF-16序列<代码>sqlcmd不存在此问题(SSMS也基于.NET)。最短复制:
选择转换(NVARCHAR(4000),0x0BDC),转换(NVARCHAR(MAX),0x0BDC)
。(同样,数据包嗅探器将证明SQL Server没有在转换过程中对这些字节执行任何转换。)不,没有区别。文本一开始就被弄乱了。你发布的不是Unicode,而是不可表示的字节。本页和您自己的帖子证明了SQL Server没有问题-StackOverflow是一个ASP.NET站点,它使用nvarchar列在SQL Server中存储Unicode数据。事实上,
是尝试使用错误的代码页读取单字节文本时使用的。某些字体可能没有该字符,而是显示一个空方块。其他驱动程序将坏数据替换为
。在任何情况下,数据在粘贴到网格中的那一刻就丢失了它只是用来显示结果的工具,而不是实际的字符。用于显示的编码使字符看起来不同。将字符0x00编码为0x7F时,所有字符看起来都一样。字符0x80到0xFF映射到不同的unicode字符,但是是一个字节而不是两个字节。字节值仍然是0x80到0xFF,但编码只是以不同的方式显示字符。这是ADO.NET客户端问题,而不是SQL Server问题。您可以通过执行
选择CONVERT(VARBINARY(MAX),…)
来验证列内容是否保持不变,并使用TDS返回数据包上的数据包嗅探器进一步验证字节是否保持不变。两列返回的结果完全相同,唯一的区别是元数据。显然,对于
NVARCHAR(MAX)
来说,它只是复制字节,而
NVARCHAR(4000)
则要经过解码步骤,过滤掉无效的UTF-16序列<代码>sqlcmd不存在此问题(SSMS也基于.NET)。最短复制:
选择转换(NVARCHAR(4000),0x0BDC),转换(NVARCHAR(MAX),0x0BDC)
。(同样,数据包嗅探器将证明SQL Server没有在转换过程中对这些字节执行任何转换。)
ALTER TABLE Test
ALTER COLUMN Test nvarchar(4000)