在SQL Server中击败这些破折号

时间:2018-08-09 08:20:47

标签: 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%'

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

enter image description here

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

From [dbo].[mytable] where artist like 'Sleater' + char(45) + '%'

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

enter image description here

因此,我想查找并替换为标准的ascii连字符,但是对于要使用什么标准来查找这些E2 80 90连字符却感到迷茫?

2 个答案:

答案 0 :(得分:2)

您的字符是连字符,有关信息,请点击此处:

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

您会看到UTF16代码是2010,因此在T-SQL中,您可以使用以下代码进行构建

SELECT NCHAR(2010) 

您可以在该车上使用任何SQL命令,例如:

Select artist
From [dbo].[mytable] where artist like N'Sleater' + NCHAR(2010) + '%'

或根据需要在

REPLACE( artist, NCHAR(2010), '-' )

带有“真实”破折号

编辑:

如果数据库的排序规则给您带来了NCHAR(2010)的麻烦,您还可以尝试使用N'‐'汽车,您可以从我给您的charbase链接中复制/粘贴该汽车:

REPLACE( artist , N'‐' , '-'  ) 

您甚至可以从这里的字符串中提取(用特殊汽车制造),所以一切都为您量身定做:

update mytable set artist=REPLACE( artist, N'‐' , '-' )

答案 1 :(得分:1)

我不知道您的表定义和COLLATION,但是我几乎可以确定您要混合使用NCHAR和CHAR类型并将Unicode多字节字符转换为单字节表示形式。看看这个演示:

WITH Demo AS
(
  SELECT N'ABC'+NCHAR(0x2010)+N'DEF' T
)
SELECT
  T,
  CASE WHEN T LIKE 'ABC'+CHAR(45)+'%' THEN 1 ELSE 0 END [Char],
  CASE WHEN T LIKE 'ABC-%' THEN 1 ELSE 0 END [Hyphen],
  CASE WHEN T LIKE N'ABC‐%' THEN 1 ELSE 0 END [Unicode-Hyphen],--unicode hyphen us used here
  CASE WHEN T LIKE N'ABC'+NCHAR(45)+N'%' THEN 1 ELSE 0 END [NChar],
  CASE WHEN CAST(T AS varchar(MAX)) LIKE 'ABC-%' THEN 1 ELSE 0 END [ConvertedToAscii],
  ASCII(NCHAR(0x2010)) ConvertedToAscii,
  CAST(SUBSTRING(T, 4, 1) AS varbinary) VarbinaryRepresentation
FROM Demo

我的结果:

T       Char        Hyphen      Unicode-Hyphen NChar       ConvertedToAscii ConvertedToAscii VarbinaryRepresentation
------- ----------- ----------- -------------- ----------- ---------------- ---------------- --------------------------------------------------------------
ABC‐DEF 0           0           1              0           1                45               0x1020

UTF-8(3字节)的表示形式与2010年的Unicode相同。