代码之家  ›  专栏  ›  技术社区  ›  TOL

MS SQL Server Management Studio中“文本”类型的列显示不正确

  •  0
  • TOL  · 技术社区  · 6 年前

    在mssql db中,我有类型为(文本,空)的列响应信息。 对一些(!)行MS SQL Management Studio显示列的输出不正确。

    对于值(预期结果):

    {"result":"Status:U-OK","hasError":false,"errorDetails":null}
    

    它只显示管理工作室中的第一个括号:

    {
    

    在“结果另存为”中,它将列值保存在文本文件中,其中每个字符用空格分隔:

    { " 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列的值,但它为新列输出的结果相同。 如果您知道如何解决此问题,请提供帮助。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dan Guzman    6 年前

    这些症状看起来像应用程序插入数据库时问题行的值被编码为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) nvarchar(MAX) 而不是被否决的 text 数据类型。