sql-server - MS SQL Server Management Studio 中“文本”类型的列显示不正确
问题描述
在 MSSQL DB 中,我有类型为(文本,空)的列 ResponseInfo。对于某些 (!) 行,MS SQL Management Studio 显示列的输出不正确。
对于值(预期结果):
{"result":"Status:U-OK","hasError":false,"errorDetails":null}
它仅显示 Management Studio 中的第一个括号:
{
在“将结果另存为”上,它将列值保存在文本文件中,其中每个字符用空格分隔:
{ " r e s u l t " : " S t a t u s : U - O K " , " h a s E r r o r " : f a l s e , " e r r o r D e t a i l s " : n u l l }
我怀疑它可能与编码有关(表编码为“Latin1_General_100_BIN”),我尝试创建 nvarchar(MAX) 列并从 ResponseInfo 列中设置值,但它为新列输出相同的结果。如果您知道如何解决此问题,请提供帮助。
解决方案
症状看起来像问题行的值在应用程序插入数据库时被编码为 Unicode。T-SQL 示例:
CREATE TABLE dbo.YourTable(ResponseInfo text);
DECLARE @UnicodeValue nvarchar(MAX) = N'{"result":"Status:U-OK","hasError":false,"errorDetails":null}';
DECLARE @BinaryValue varbinary(MAX) = CAST(@UnicodeValue AS varbinary(MAX));
DECLARE @VarcharValue varchar(MAX) = CAST(@BinaryValue AS varchar(MAX));
INSERT INTO dbo.YourTable VALUES(@VarcharValue);
SELECT ResponseInfo
FROM dbo.YourTable;
您可以检查原始值以验证:
SELECT CAST(ResponseInfo AS varbinary(MAX))
FROM dbo.YourTable;
如果数据未正确编码,您可以使用如下所示的更新查询来扭转错误。确保仅针对问题行。
UPDATE dbo.YourTable
SET ResponseInfo = CAST(CAST(CAST(CAST(ResponseInfo AS varchar(MAX)) AS varbinary(MAX)) AS nvarchar(MAX)) AS varchar(MAX))
WHERE <problem-row-criteria-here>;
当然,您需要修复应用程序以避免出现问题。尽管与您的问题无关,但最好使用varchar(MAX)
ornvarchar(MAX)
代替已弃用的text
数据类型。
推荐阅读
- javascript - 如何为数组销毁提供动态值?
- java - IncompatibleClassChangeError - net.sf.ehcache.config.BeanHandler.startElement
- python - 层权重形状 (1, 1) 与为 keras 模型提供的权重形状 (1,) 不兼容
- reactjs - 仅返回选中输入的选定值
- javascript - 如何多次清除图像?
- plotly-dash - 子图的绘图背景未更新
- excel - VBA:查找值是否是表中存在的第一个实例
- java - 将 jdk 8 迁移到 jdk 11,mysql 为 SSL 抛出错误
- flutter - 如何为flutter中的每个ListView项目设置不同的背景颜色
- android - 设备是否正确安装在 android 上