无法通过SQL查询替换Char(63)

时间:2011-06-22 14:05:00

标签: sql sql-server

我在表格中有一些行有一些不寻常的特征。当我对该字符使用ascii()或unicode()时,它返回63.但是当我尝试这个时 -

update MyTable
set MyColumn = replace(MyColumn,char(63),'') 

它不会取代。替换功能后仍然存在异常字符。 Char(63)偶然看起来像一个问号。

例如我的字符串是'ddd #dd ddd',其中#这是我的不寻常的角色和

select unicode('#')

给我63.但是这段代码

declare @str nvarchar(10) = 'ddd#dd ddd'
set @char = char(unicode('#'))
set @str = replace(@str,@char,'')

正在运作!

有任何想法如何解决这个问题?

5 个答案:

答案 0 :(得分:2)

char(63) 是一个问号。听起来这些“不寻常”的字符显示为作为问号,但实际上并不是带有字符代码63的字符。

如果是这种情况,那么删除char(63)(又名'?')的出现当然不会对这些“异常”字符产生影响。

答案 1 :(得分:2)

char(63)不仅看起来像'?',它实际上是'?'。

(作为一个简单的测试,确保你的键盘上有numlock,按住alt键并在数字键盘中键入'63' - 你可以通过这种方式获得各种乐趣,尝试alt-205,然后alt-206和alt-205再次:═╬═)

可能是'?'但是,您看到的不是char(63),而且更多地表明SQL Server不知道如何显示该字符。

当你跑步时得到什么:

select ascii(substring('[yourstring]',[pos],1));
--or
select unicode(substring('[yourstring]',[pos],1));

[yourstring]是您的字符串,[pos]是字符串中char的位置

修改

从您的评论中看起来它似乎是一个问号。你试过了吗?

replace(MyColumn,'?','') 

<强> EDIT2

出于兴趣,以下为您做了什么:

replace(replace(MyColumn,char(146),''),char(63),'')

答案 2 :(得分:0)

我相信您实际上对字面上的 CHAR(63) 没有任何问题,因为这应该只是一个普通字符,您应该能够正确使用它。

我认为发生的事情是,错误地将一个 UTF 字符(例如,西里尔字母“А”)插入到表中 - 以及您的:

  • 列设置,
  • SQL 代码,
  • 或传入的参数

没有为此做好准备。 在这种情况下,您可能会看到该符号为 ?,其 CHAR() 函数实际上会给出 63,但您应该真正使用 NCHAR() 来找出真正的代码

<块引用>

让我举一个具体的例子,我有很多次 - 问题 带有西里尔字母“А”,它看起来与拉丁字母相同,但具有 1040 的 unicode。

如果您尝试在该 1040 字符上使用非 UTF CHAR 函数, 你会得到一个代码 63,这不是真的(而且可能只是一个 多字节字符第一个字节的信息)。

实际上,运行它可以使我的示例中的差异显而易见:

SELECT NCHAR(65) AS Latin_A, NCHAR(1040) Cyrilic_A, ASCII(NCHAR(1040)) Latin_A_Code, UNICODE(NCHAR(1040)) Cyrilic_A_Code;

答案 3 :(得分:0)

那个向我们展示了'?'的空字符串在子串中。 给我们 Ascii 值为 63。

这是一个零宽度空间,如果您从 ui 复制数据并插入到数据库中,则会附加该空间。

要替换数据,您可以使用以下查询

**set MyColumn = replace(MyColumn,NCHAR(8203),'')** 

答案 4 :(得分:-1)

这也应该有效:

UPDATE TABLE 
    SET [FieldName] =  SUBSTRING([FieldName], 2, LEN([FieldName])) 
    WHERE ASCII([FieldName]) = 63