【问题标题】:Identifying unicode character in nvarchar column in SQL Server识别 SQL Server 中 nvarchar 列中的 unicode 字符
【发布时间】:2018-04-23 04:31:54
【问题描述】:

我在 SQL Server 数据库中有一个名为 airports 的表,其中一列声明为 nvarchar(255)。我必须将其声明为nvarchar,否则SSIS 无法从API 生成的.csv 文件中导入数据。

我在这个表中有大约 25k 条记录,据我所知,通过运行以下查询,763 条记录中有 Unicode 字符:

select cast(name as varchar), name 
from airports 
where cast(name as varchar) <> name

第一行显示在第 1 列和第 2 列中返回的以下两个值

Harrisburg Capital City Airpor  
Harrisburg Capital City Airport

第 1 列的第一个值已将最后一个 t 剥离,我认为这意味着字符串中有一个 unicode 字符。如果我错了,请告诉我,因为我对 unicode 字符有点无用。

我的问题是:如何在列中找到 unicode 字符,是否有安全/推荐的删除它们的方法?

我确实尝试过这个,看看我能不能找到它,但它没有做我认为它会做的事情。

set nocount on
DECLARE @nstring NVARCHAR(100)
SET @nstring =(select name from airports where fs = 'HAR')
DECLARE @position INT
SET @position = 1

DECLARE @CharList TABLE (Position INT,UnicodeChar NVARCHAR(1),UnicodeValue INT)

WHILE @position <= DATALENGTH(@nstring)
BEGIN
    INSERT @CharList
       SELECT 
           @position as Position,
           CONVERT(nchar(1),SUBSTRING(@nstring, @position, 1)) as UnicodeChar,
           UNICODE(SUBSTRING(@nstring, @position, 1)) as UnicodeValue
    SET @position = @position + 1
END

SELECT * 
FROM @CharList[/sql]
ORDER BY unicodevalue

输出如下

32      NULL
33      NULL
34      NULL
35      NULL
36      NULL
37      NULL
38      NULL
39      NULL
40      NULL
41      NULL
42      NULL
43      NULL
44      NULL
45      NULL
46      NULL
47      NULL
48      NULL
49      NULL
50      NULL
51      NULL
52      NULL
53      NULL
54      NULL
55      NULL
56      NULL
57      NULL
58      NULL
59      NULL
60      NULL
61      NULL
62      NULL
11      32
19      32
24      32
25  A   65
20  C   67
12  C   67
1   H   72
2   a   97
13  a   97
17  a   97
7   b   98
10  g   103
15  i   105
5   i   105
21  i   105
26  i   105
18  l   108
29  o   111
28  p   112
14  p   112
9   r   114
3   r   114
4   r   114
30  r   114
27  r   114
6   s   115
16  t   116
22  t   116
31  t   116
8   u   117
23  y   121

【问题讨论】:

  • 首先,尝试使用 cast (name as varchar(255)) 而不是 cast (name as varchar)。如果您不指定长度,它将默认为 30,这可以解释您看到的截断。
  • 谢谢,很好的接机。个人认为是对数据库的大无知来决定...
  • 原来我有 14 个坏行,需要进一步调查,但你几乎解决了问题,因为没有 unicode 字符
  • 另外,如果您需要“查看”该字段的确切内容,您可以执行以下操作:CAST(name as varbinary(max))。这会将内容显示为十六进制字节。

标签: sql sql-server tsql unicode sql-server-2012


【解决方案1】:

但是,如果您想首先找到包含一些 unicode 字符的记录,请在 case 表达式的帮助下按照以下方法进行

;WITH CTE
 AS (
 SELECT DATA, 
        CASE
            WHEN(CAST(DATA AS VARCHAR(MAX)) COLLATE SQL_Latin1_General_Cp1251_CS_AS) = DATA
            THEN 0
            ELSE 1
        END HasUnicodeChars,
       ROW_NUMBER() OVER (ORDER BY (SELECT 1)) RN
 FROM <table_name>)

SELECT * FROM CTE where HasUnicodeChars = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2013-08-21
    • 2021-12-07
    相关资源
    最近更新 更多