【问题标题】:mysql: replace \ (backslash) in stringsmysql:替换字符串中的\(反斜杠)
【发布时间】:2023-04-03 07:57:01
【问题描述】:

我遇到以下问题:

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

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';

很好。

但是如何自动对字符串名称执行此操作?

类似下面的东西不会这样做:

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

我得到:A\\\BC

有什么建议吗?

非常感谢。

【问题讨论】:

  • 不确定我是否关注。您是否希望找到插入的值而不以插入相同的方式指定它?
  • 您是否考虑过使用不同的分隔符?如果问题是过时数据,那么更新旧数据的简单脚本就足够了。
  • 可能我解释的不是很好。事实证明,如果我使用 quote() 作为我想要的名称,即 \ 是字面意思。

标签: mysql replace backslash


【解决方案1】:

您必须使用“逐字字符串”。使用该字符串后,您的替换功能将 看起来像这样

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

    你可以使用LIKE:

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

    【讨论】:

      【解决方案3】:

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

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

      但是您不能通过 SQL 本身来做到这一点 - 如果您尝试将非转义字符串提供给 SQL,数据会丢失并且无法重建。

      【讨论】:

        【解决方案4】:

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

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

          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}$';
        

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

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

        【讨论】:

          【解决方案5】:

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

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

          输出(见this running on 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';
          

          【讨论】:

          • 选择替换('A\\B\C', '\', '\\');返回错误,因为反斜杠正在转义搜索参数中的撇号。
          • @Jestep 感谢您接受这个。我纠正了错误。干杯
          【解决方案6】:

          不完全确定你的意思,但这应该可以。

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

          它基本上会用 \\ 替换 \ :)

          这是你想要的吗?

          【讨论】:

          • 这甚至不会“编译”你有一个语法错误转义第二个参数。
          猜你喜欢
          • 2011-08-01
          • 2018-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 2011-11-23
          相关资源
          最近更新 更多