在 SQL 服务器中击败这些破折号
Defeat these dashed dashes in SQL server
我有一个 table,其中包含各种录音艺术家的名字。其中一个名字中有一个破折号。如果我 运行 以下内容:
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)
但是,如果我将 where 子句更改为:
From [dbo].[mytable] where artist like 'Sleater' + char(45) + '%'
我没有返回任何结果。如果我将艺术家列的输出复制并粘贴到十六进制编辑器中,我可以看到破折号实际上存储为 E2 80 90,即多字节连字符的 Unicode 字节序列。
所以,我想用标准的 ascii 连字符查找并替换此类事件,但我不知道使用什么标准来查找这些 E2 80 90 连字符?
你的字符是连字符,这里有它的信息:
https://www.charbase.com/2010-unicode-hyphen
您可以看到 UTF16 代码是 2010,因此在 T-SQL 中您可以使用
构建它
SELECT NCHAR(2010)
从那里你可以对那辆车使用任何 SQL 命令,例如在 select 中:
Select artist
From [dbo].[mytable] where artist like N'Sleater' + NCHAR(2010) + '%'
或如您所愿
REPLACE( artist, NCHAR(2010), '-' )
带有 "real" 破折号
编辑:
如果您的数据库排序规则给您带来了一些 NCHAR(2010) 问题,您也可以尝试使用您将从字符库 copy/paste link 中得到的汽车 N'-'我给了你:
REPLACE( artist , N'‐' , '-' )
你甚至可以从这里的绳子上取下(用专车制作)所以一切都为你量身定做:
update mytable set artist=REPLACE( artist, N'‐' , '-' )
我不知道您的 table 定义和排序规则,但我几乎可以肯定您正在混合使用 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 字节)表示与 unicode 中的 2010 相同。
我有一个 table,其中包含各种录音艺术家的名字。其中一个名字中有一个破折号。如果我 运行 以下内容:
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)
但是,如果我将 where 子句更改为:
From [dbo].[mytable] where artist like 'Sleater' + char(45) + '%'
我没有返回任何结果。如果我将艺术家列的输出复制并粘贴到十六进制编辑器中,我可以看到破折号实际上存储为 E2 80 90,即多字节连字符的 Unicode 字节序列。
所以,我想用标准的 ascii 连字符查找并替换此类事件,但我不知道使用什么标准来查找这些 E2 80 90 连字符?
你的字符是连字符,这里有它的信息:
https://www.charbase.com/2010-unicode-hyphen
您可以看到 UTF16 代码是 2010,因此在 T-SQL 中您可以使用
构建它SELECT NCHAR(2010)
从那里你可以对那辆车使用任何 SQL 命令,例如在 select 中:
Select artist
From [dbo].[mytable] where artist like N'Sleater' + NCHAR(2010) + '%'
或如您所愿
REPLACE( artist, NCHAR(2010), '-' )
带有 "real" 破折号
编辑:
如果您的数据库排序规则给您带来了一些 NCHAR(2010) 问题,您也可以尝试使用您将从字符库 copy/paste link 中得到的汽车 N'-'我给了你:
REPLACE( artist , N'‐' , '-' )
你甚至可以从这里的绳子上取下(用专车制作)所以一切都为你量身定做:
update mytable set artist=REPLACE( artist, N'‐' , '-' )
我不知道您的 table 定义和排序规则,但我几乎可以肯定您正在混合使用 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 字节)表示与 unicode 中的 2010 相同。