ASCII(?)特殊字符问题

时间:2014-06-16 09:11:22

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

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

EX:1)谢菲尔德 2)Grif fi n-Smith 3)Lhoёst

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

提前致谢!

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我更愿意发表评论,但我的声誉不足以评论Narti的回答。无论如何,虽然米高梅将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)), '?','');

只是想将此添加到此帖子中。

谢谢,

答案 2 :(得分:0)

ASCII代码63的字符不是一些奇怪的字符,它是问号。 (毫不奇怪它被显示为问号,因为它是一个问号。)

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

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

答案 3 :(得分:0)

您可以直接使用该角色。

如果你知道它在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. 两个%都会出现,零或更多。
  4. 用于逃避字符搜索。

    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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

请注意,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)) = '?';