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

时间:2012-04-08 00:19:16

标签: mysql replace backslash

我遇到以下问题:

我有一个表T,它有一个名称列名。名称具有以下结构:

一个\\乙\ 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

有什么建议吗?

非常感谢提前。

6 个答案:

答案 0 :(得分:3)

你必须使用“逐字字符串”。使用该字符串后你的替换函数会 看起来像这样

Replace(@"\", @"\\")

我希望它会对你有所帮助。

答案 1 :(得分:1)

文字A\\B\C必须编码为A\\\\A\\Creplace()的参数也需要转义:

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

输出(见this running on SQLFiddle):

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


所以使用替换没什么意义。这两个陈述是等价的:

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

答案 2 :(得分:1)

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

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

  1) S\\D\B

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

如果给定示例可能包含多个char

2) D\\B\ACCC

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

注意:我使用5作为char的最大出现次数,考虑到字段大小为10,如创建表查询中所述。

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

答案 3 :(得分:1)

您将数据库中的内容与您在SQL语句中表示数据的方式混淆。当数据库中的字符串包含特殊字符\时,您必须键入\\来表示该字符,因为\是SQL语法中的特殊字符。您必须在INSERT语句中执行此操作,但您还必须在REPLACE函数的参数中执行此操作。数据中实际上从来没有任何双斜线,它们只是UI的一部分。

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

但是您无法通过SQL本身来实现 - 如果您尝试将非转义字符串提供给SQL,则数据会丢失并且无法重建它。

答案 4 :(得分:0)

您可以使用LIKE

SELECT NAME FROM T WHERE NAME LIKE '%\\\\%';

答案 5 :(得分:-3)

不完全确定你的意思但是,这应该有效。

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

它基本上会用\\:)

替换\

这是你想要的吗?