代码之家  ›  专栏  ›  技术社区  ›  wesgarrison

用于替换数据库insert语句中的引号的Regexp

  •  1
  • wesgarrison  · 技术社区  · 16 年前

    sqlite3转储格式:

    CREATE TABLE "products" (
      "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
      "name" varchar(255), 
      "desc" varchar(255) );
    
    INSERT INTO "products" VALUES(1,'Flux Capacitor',
      'This is the "real" thing.\nPromise!')
    

    带反勾号的双引号和mysql会很高兴。

    就我所知:

    /"[^"]*"/s
    

    ... 匹配双引号文本,但我不知道如何限定只有单引号中的双引号才应该匹配。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Bill Karwin    16 年前

    我将MySQL更改为接受双引号作为标识符分隔符。这是标准的SQL行为,您可以使用SQL模式使MySQL具有这种行为:

    mysql> SET SQL_MODE = ANSI;
    

    或者更具体地说:

    mysql> SET SQL_MODE = ANSI_QUOTES;
    

    那么MySQL应该理解您的数据转储。

    Server SQL Modes “了解更多信息。

        2
  •  0
  •   Havenard    16 年前

    preg_replace_callback() :

    
    <?php
    
        $sql = file_get_contents('sqlite3 dump.txt');
        function callback($match) { return str_replace('"', '`', $match[0]); }
        $sql = preg_replace_callback('/CREATE TABLE .*?;/s', callback, $sql);
        echo preg_replace_callback('/INSERT INTO .*? VALUES/s', callback, $sql);
    
    ?>

    除非你能像比尔·卡温所说的那样“设置SQL\u MODE=ANSI\u引号”。

        3
  •  0
  •   bobince    16 年前

    我可以用反勾号替换所有双引号,mysql会很高兴的。

    现在很高兴,但这并不能解决整个问题,所以很容易在将来失败。撇号和反斜杠在MySQL中的工作方式也不同。

    你不可能可靠。SQL语法实际上相当复杂,在一般情况下无法通过正则表达式解析。

    Bill建议更改SQL_模式以适应现有语法,这是一种更好的方法。我一直在ANSI模式下运行MySQL,因为我不喜欢根据某个特定数据库的缺点定制应用程序。