我在表格中有一些行有一些不寻常的特征。当我对该字符使用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,'')
正在运作!
有任何想法如何解决这个问题?
答案 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 字符(例如,西里尔字母“А”)插入到表中 - 以及您的:
没有为此做好准备。
在这种情况下,您可能会看到该符号为 ?
,其 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