【发布时间】: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