在SQL Server中击败这些破折号

bas*_*sin 5 sql-server unicode non-ascii-characters

我有一个表格,其中包含各种唱片艺术家的姓名。其中之一的名称中带有破折号。如果我运行以下命令:

Select artist
, substring(artist,8,1) as substring_artist
, ascii(substring(artist,8,1)) as ascii_table
, ascii('-') as ascii_dash_key /*The dash key next to zero */
, len(artist) as len_artist 
From [dbo].[mytable] where artist like 'Sleater%'
Run Code Online (Sandbox Code Playgroud)

然后返回以下内容。这似乎表明在艺术家列中存储了破折号(ASCII 45)

在此处输入图片说明

但是,如果我将where子句更改为:

From [dbo].[mytable] where artist like 'Sleater' + char(45) + '%'
Run Code Online (Sandbox Code Playgroud)

我没有返回任何结果。如果我将artist列的输出复制并粘贴到十六进制编辑器中,则可以看到破折号实际上存储为E2 80 90,即多字节连字符的Unicode字节序列。

在此处输入图片说明

因此,我想查找这种情况并用标准的ascii连字符代替,但是我对于使用什么标准来查找这些E2 80 90连字符不知所措?

Cal*_*ali 3

你的字符是连字符,有关它的信息在这里:

\n\n

https://www.charbase.com/2010-unicode-hyphen

\n\n

您可以看到 UTF16 代码是 2010,因此在 T-SQL 中您可以使用以下命令构建它

\n\n
SELECT NCHAR(2010) \n
Run Code Online (Sandbox Code Playgroud)\n\n

从那里您可以对该车使用任何 SQL 命令,例如在如下选择中:

\n\n
Select artist\nFrom [dbo].[mytable] where artist like N\'Sleater\' + NCHAR(2010) + \'%\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者如你所愿

\n\n
REPLACE( artist, NCHAR(2010), \'-\' )\n
Run Code Online (Sandbox Code Playgroud)\n\n

带有“真正的”破折号

\n\n

编辑:

\n\n

如果您的数据库排序规则给您带来了 NCHAR(2010) 的一些麻烦,您还可以尝试使用汽车 N\'\xe2\x80\x90\',您将从我给您的字符库链接中复制/粘贴所以 :

\n\n
REPLACE( artist , N\'\xe2\x80\x90\' , \'-\'  ) \n
Run Code Online (Sandbox Code Playgroud)\n\n

您甚至可以从这里的绳子上取下(用特殊的汽车制作),所以一切都是为您制作的:

\n\n
update mytable set artist=REPLACE( artist, N\'\xe2\x80\x90\' , \'-\' )\n
Run Code Online (Sandbox Code Playgroud)\n