【问题标题】:Get nvarchar records that were inserted as varchar获取作为 varchar 插入的 nvarchar 记录
【发布时间】:2021-10-26 08:14:55
【问题描述】:

如何获取 NVARCHAR 列的所有值,其中一些值被意外插入而没有使用 N 前缀,因此被替换为 ?,然后将这些值更改为正确的形式?

例如,如果我有以下情况:

CREATE TABLE #Test
(
    Value nvarchar(max)
)

INSERT INTO #Test(Value) values(N'иытание1')
INSERT INTO #Test(Value) values('иытание2')
INSERT INTO #Test(Value) values(N'иытание3')

SELECT * FROM #Test

输出:

Value 
-------
иытание1
????????2 
иытание3   

我想得到最初的'иытание2',后来变成了乱码,并修复它。

【问题讨论】:

  • 你不能。 ? 不是占位符;它是最初转换字符串时使用的实际替换字符(在存储到列中之前,转换为数据库默认排序规则)。您可以使用SELECT CONVERT(VARBINARY(MAX), Value) FROM #Test 更清楚地看到这一点; 3F00? 的代码点。
  • 您使用的是哪个 dbms?上述这种奇怪的行为是特定于产品的。
  • @jarlh Sql Server,谢谢,我加了标签

标签: sql sql-server unicode nvarchar


【解决方案1】:

您不能,因为它在插入表格时被转换?。原始数据不见了。除非您在其前面加上 N 前缀,否则文字字符串将创建为 VARCHAR

【讨论】:

    【解决方案2】:

    您可以使用下面的查询来找出只有 ASCII 字符的行。

    Reference SO post on finding non-ascii characters

    -- > 0 means NON-ASCII characters are present
    -- = 0 means only ASCII characters are present
    SELECT * FROM #TEST 
    WHERE
    patindex('%[^ !-~]%' COLLATE Latin1_General_BIN,VALUE) = 0 
    
    

    ??????????2

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 2013-01-16
      • 1970-01-01
      • 2020-04-27
      • 2011-07-31
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      相关资源
      最近更新 更多