【问题标题】:Unable to replace Char(63) by SQL query无法通过 SQL 查询替换 Char(63)
【发布时间】:2021-05-25 21:16:42
【问题描述】:

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

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

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

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

select unicode('#')

return me 63.But this code

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

正在工作!

有什么办法解决这个问题吗?

其他信息:

select ascii('�') 返回 63,select ascii('?') 也是如此。最后select char(63) 返回? 而不是菱形问号。

当这个字符被粘贴到 Excel 或文本编辑器中时,它看起来像一个空格,但在 SQL Server 查询窗口中(显然,在 StackOverflow 上也是如此),它看起来像一个包含问号的菱形。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    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] 是您的字符在字符串中的位置

    编辑

    从您的评论来看,这似乎是一个问号。你试过了吗:

    replace(MyColumn,'?','') 
    

    EDIT2

    出于兴趣,以下内容对您有什么帮助:

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

    【讨论】:

    • 146 - 当我使用 nvarchar 类型时,当类型为 varchar 时为 63
    • 结果和上次一样。
    • 那我被难住了。对不起。
    • 我意识到这是 8 岁,但我今天遇到了这个问题。我从 Excel 复制了一个单元格,其中字符看起来像一个空格。粘贴到 EditPlus 文本编辑器中,它看起来像一个空格。从那里复制到 SQL Server 2016 查询窗口,它看起来像一个实心(红色,在字符串分隔符之间)菱形,其中包含一个(白色)问号。 select ascii('�') 返回 63。select ascii('?') 也是如此。最后select char(63) 返回? 而不是菱形问号。 MSDN 有一篇我无法访问的文章“带问号的黑色菱形 - MSDN - Microsoft”。
    • 附言。在 EditPlus 中保存时,我收到消息“此文件包含在当前编码中可能丢失的字符”——这可能为如何在 SQL 中解决此问题提供一些线索?以下链接讨论了此 EditPlus 消息:satya-weblog.com/2010/07/…
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我相信您实际上并没有遇到字面意义上的 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;
      

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

          这应该也可以:

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

          【讨论】:

          • 欢迎来到 Stack Overflow!您能否扩展您的解决方案以提供一些上下文并解释它如何回答问题。
          猜你喜欢
          • 1970-01-01
          • 2011-11-30
          • 2021-02-02
          • 1970-01-01
          • 1970-01-01
          • 2018-06-08
          • 2012-06-18
          • 2019-08-12
          • 1970-01-01
          相关资源
          最近更新 更多