MySQL:在字符串中替换 \(反斜杠)

12

我面临以下问题:

我有一个表T,其中有一个名为Name的列,里面存储了一些名称。这些名称的格式如下:

A\\B\C

您可以按照以下方式自行创建:

create table T ( Name varchar(10));

insert into T values ('A\\\\B\\C');

select * from T;

现在如果我这样做:
select Name from T where Name = 'A\\B\C';

那不行,我需要转义反斜杠\:

select Name from T where Name = 'A\\\\B\\C';

好的。
但是如何自动地对字符串Name进行这个操作呢?
下面这样的代码并不能完成此操作:
select replace('A\\B\C', '\\', '\\\\');

我得到了:A\\\BC,有什么建议吗?非常感谢。

1
不太明白您的意思。您是否期望在没有像插入时指定相同方式的情况下找到已插入的值? - jefflunt
你考虑过使用不同的分隔符吗?如果问题是陈旧的数据,一个简单的脚本更新旧数据就足够了。 - flagoworld
也许我没有解释清楚。事实证明,如果我在名称上使用quote(),我会得到我想要的结果,即\被字面上使用。 - user1316758
6个回答

5
你需要使用 "verbatim string"。使用该字符串后,你的 Replace 函数将会是这样的。
Replace(@"\", @"\\")

我希望它对您有所帮助。

1

字面上的A\\B\C必须编码为A\\\\A\\C,而replace()的参数也需要转义:

select 'A\\\\B\\C', replace('A\\\\B\\C', '\\', '\\\\');

输出结果(请参见在SQLFiddle上运行此代码):

A\\B\C         A\\\\B\\C


所以使用replace没有什么意义。这两个语句是等价的:

select Name from T where Name = replace('A\\\\B\\C', '\\', '\\\\');
select Name from T where Name =         'A\\\\B\\C';

选择 replace('A\B\C', '', '\'); 返回错误,因为反斜杠转义了搜索参数中的撇号。 - Jestep
@Jestep 谢谢你发现了这个问题。我已经纠正了错误。祝好! - Bohemian

1

您混淆了数据库中的数据和在SQL语句中表示该数据的方式。当数据库中的字符串包含像\这样的特殊字符时,您必须键入\\来表示该字符,因为\是SQL语法中的特殊字符。您必须在INSERT语句中这样做,但也必须在REPLACE函数的参数中这样做。实际上,数据中从来没有双斜杠,它们只是界面的一部分。

您为什么认为需要在SQL表达式中加倍斜杠?如果您正在输入查询,应该在命令行中加倍斜杠。如果您正在使用编程语言生成查询,则最好的解决方案是使用预处理语句;API将负责正确的编码(预处理语句通常使用二进制接口,处理原始数据)。如果出于某种原因,您需要通过构造字符串执行查询,则语言应该提供一个函数来转义字符串。例如,在PHP中,您将使用mysqli_real_escape_string

但是您不能仅通过SQL本身来完成此操作--如果您尝试将未转义的字符串提供给SQL,数据将丢失,无法重建。


1

使用正则表达式可以解决您的问题。

以下查询将解决给定的示例。

  1) S\\D\B

select * from T where Name REGEXP '[A-Z]\\\\\\\\[A-Z]\\\\[A-Z]$';

如果给定的示例可能有多个字符

2) D\\B\ACCC

select * from T where Name REGEXP '[A-Z]{1,5}\\\\\\\\[A-Z]{1,5}\\\\[A-Z]{1,5}$';

注:我已经使用了5作为最大字符出现次数,考虑到字段大小是10,正如在创建表查询中提到的那样。

我们仍然可以概括它。如果这仍然没有达到您的期望,请随时寻求我的帮助。


0
你可以使用LIKE
SELECT NAME FROM T WHERE NAME LIKE '%\\\\%';

-3

不太确定你的意思,但是这应该可以工作。

select replace('A\\B\C', '\', '\\');

它基本上会将遇到的 \ 替换为 \\ :)

这是你想要的吗?


这甚至不能“编译”,你的语法错误逃脱了第二个参数。 - Andras Gyomrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接