【问题标题】:ASCII (?) Special characters issueASCII (?) 特殊字符问题
【发布时间】:2014-06-16 09:11:22
【问题描述】:

我有一个联系人表,其中存储了联系人的姓名。因此,我们的研究团队从网站上复制名称并将其粘贴到应用程序中,同时我们将一些特殊字符存储到数据库中。检查下面的示例,这些示例在提取到文本文件时将反映为“?”(ASCII 代码 = 63)。联系人姓氏示例如下。

例如:1) 谢菲尔德 2) 格里芬-史密斯 3) 洛斯特

有没有办法在我的联系人表的“Last_name”列中查询 ASCII 码为 63 的所有特殊字符的列表,以便我可以找出并将它们发送给研究人员以更新正确的名称。

提前致谢!

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2005


    【解决方案1】:

    如果您想查找所有包含非 ASCII 字符的条目,您可以执行以下操作:

    select * from TheTable where Last_name != Cast(Last_name AS VARCHAR(1000)) 
    

    【讨论】:

    • 您好 Narti,您的回答在某些方面很有用,但它不会回答我的问题。总之谢谢!!
    【解决方案2】:

    我更愿意发表评论,但我的声誉不足以评论 Narti 的回答。无论如何,尽管米高梅将纳尔蒂的答案标记为正确答案,但他/她评论说它并没有完全回答他/她的问题。好吧,它回答了我完全相同的问题。

    我修改了没有替换 ascii 63 的脚本,我能够通过强制转换然后替换来替换它。

    从这里:(这不起作用)

    update TheTable set last_name = replace(last_name, char(63),'');
    

    至此:(当您投射并使其成为实际的“?”时,现在您可以替换“?”并将其删除

    update TheTable set last_name = replace(Cast(last_name AS VARCHAR(1000)), '?','');
    

    只是想将此添加到此线程。

    谢谢,

    【讨论】:

      【解决方案3】:

      ASCII 码为 63 的字符不是什么奇怪的字符,它是问号。 (它显示为问号也就不足为奇了,因为它是一个问号。)

      要查找包含问号的记录,您可以使用like 运算符:

      select * from TheTable where Last_name like '%?%'
      

      【讨论】:

      • 是的,但是在数据库中,字符不是以“?”的格式存储的它存储为“Sheffield”,但在将其复制到记事本时,它正在转换为“?”所以我想要所有会变成“?”的名字复制到记事本时。希望你能理解我的问题。
      • @Manojgade:啊哈,你说它们在数据库中存储为 ASCII 码 63,所以我认为它们是... 准确找到某些特定编码中不支持的字符会很复杂,但您可以使用 select * from TheTable where Last_name like '%[^A-Za-z\- ]%' escape '\' 之类的方式获取包含潜在麻烦字符的名称。
      【解决方案4】:

      您可以直接使用该字符。

      如果你知道它在键盘中,比如 63 是 ascii 的?然后将此查询运行为

      declare @t table (col varchar(50))
      
      insert into @t values('ajay'),('bbb?bb'),('bbb?cc'),('55?bb')
      
      select * from @t where col like '%?%'
      

      否则

      您可以为此使用正则表达式。

      要找出不是字母,简单查询为

      SELECT Col1
      FROM TABLE
      WHERE Col1 like '%[^a-Z0-9]%'
      

      Find all special characters in a column in SQL Server 2008

      Check if field contains special character in SQL

      '%[^a-Z0-9]%'背后的逻辑是,

      1. a-Z0-9 是搜索所有字母字符
      2. ^ 用于非运算符,表示没有字母
      3. 两个 % 都出现,零次或多次。

      用于转义字符搜索。

      http://web.archive.org/web/20150519072547/http://sqlserver2000.databases.aspfaq.com:80/how-do-i-search-for-special-characters-e-g-in-sql-server.html

      【讨论】:

      • 您的查询为我提供了列中所有可用的特殊字符,但我的要求是仅获取 ASCII 值为 63 的特殊字符。
      • 您好,请检查我上面指定的示例并尝试将它们复制到您的记事本中,这将告诉您故事并添加到之前我将数据存储在我指定的示例中的表中,而不是“?”在单词的中间。我的挑战是识别这些特殊字符,实际上我不想查询我的专栏中可用的所有特殊字符我专门针对 ASCII 值为 63 的特殊字符。希望你现在明白了。
      【解决方案5】:
      create function fnSpecialChars(@MyString as varchar(100)) returns bit as 
      begin
          declare @result as bit
          declare @i as int
          declare @n as int
          set @result = 0
          set @i = 1 
          if @MyString = '' or @MyString is null 
              set @result = 0 
          else
              begin
                  set @n = datalength(@MyString)
                  while @i <= @n and @result = 0
                      begin
                          if ascii(substring(@MyString, @i, 1)) = 63 --between 128 and 255 
                              set @result = 1
                          else
                              set @i = @i + 1
                      end
              end
          return @result
      end
      GO
      
      
      
      
      SELECT * FROM tbl_crm_h_contact WHERE dbo.fnSpecialChars(last_nm) = 1
      

      【讨论】:

        【解决方案6】:

        请注意,ASCII 字符是 0-127 代码点范围内的字符。 128-255 范围内的字符(有时也称为扩展 ASCII 字符)取决于列排序规则的代码页。当您插入未映射到目标排序代码页中的字符的字符时,SQL Server 会将字符更改为“?”或将其映射到一个接近的替代字符(例如“Ǜ”到“U”)。我提到这一点是因为它不仅是“?”这可能是一个问题。转换数据时会发生这种字符丢失,因此在插入数据后无法识别原始字符。

        下面的脚本将根据您的默认数据库排序规则列出大多数问题字符。请注意,这会检查所有数学上可能的 UCS-2 代码点,而不是有效 UCS-2 字符的子集。

        WITH 
              t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n))
            , t256 AS (SELECT 0 AS n FROM t4 AS a CROSS JOIN t4 AS b CROSS JOIN t4 AS c CROSS JOIN t4 AS d)
            , t64k AS (SELECT ROW_NUMBER() OVER (ORDER BY (a.n)) - 1 AS num FROM t256 AS a CROSS JOIN t256 AS b)
        SELECT 
              num AS UnicodeCodePoint
            , NCHAR(num) AS UnicodeChar
            , CAST(NCHAR(num) AS char(1)) AS AsciiChar
        FROM t64k
        WHERE 
            CAST(NCHAR(num) AS char(1)) = '?';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-19
          • 1970-01-01
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多