我有一个联系表,其中存储了联系人的姓名。因此,我们的研究团队从网站上复制名称并将其粘贴到应用程序中,而复制时我们将一些特殊字符存储到数据库中。检查下面的示例,这些示例在提取到文本文件时将反映为“?”(ASCII代码= 63)。联系人的例子姓氏列表如下。
EX:1)谢菲尔德 2)Grif fi n-Smith 3)Lhoёst
有没有办法在我的联系表的“Last_name”列中查询ASCII码可用的所有特殊字符列表为63,以便我可以找出并发送给研究人员以更新正确的名称。
提前致谢!
答案 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]%'是的,
用于逃避字符搜索。
答案 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)) = '?';