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连字符不知所措?
你的字符是连字符,有关它的信息在这里:
\n\nhttps://www.charbase.com/2010-unicode-hyphen
\n\n您可以看到 UTF16 代码是 2010,因此在 T-SQL 中您可以使用以下命令构建它
\n\nSELECT NCHAR(2010) \nRun Code Online (Sandbox Code Playgroud)\n\n从那里您可以对该车使用任何 SQL 命令,例如在如下选择中:
\n\nSelect artist\nFrom [dbo].[mytable] where artist like N\'Sleater\' + NCHAR(2010) + \'%\'\nRun Code Online (Sandbox Code Playgroud)\n\n或者如你所愿
\n\nREPLACE( artist, NCHAR(2010), \'-\' )\nRun Code Online (Sandbox Code Playgroud)\n\n带有“真正的”破折号
\n\n编辑:
\n\n如果您的数据库排序规则给您带来了 NCHAR(2010) 的一些麻烦,您还可以尝试使用汽车 N\'\xe2\x80\x90\',您将从我给您的字符库链接中复制/粘贴所以 :
\n\nREPLACE( artist , N\'\xe2\x80\x90\' , \'-\' ) \nRun Code Online (Sandbox Code Playgroud)\n\n您甚至可以从这里的绳子上取下(用特殊的汽车制作),所以一切都是为您制作的:
\n\nupdate mytable set artist=REPLACE( artist, N\'\xe2\x80\x90\' , \'-\' )\nRun Code Online (Sandbox Code Playgroud)\n