1

sqlite3 データベースを mysql に変換しています。

AUTOINCREMEMT およびその他の必要なものを変更する sed 用の優れたコマンド ファイルがありますが、最後のファイルである二重引用符に固執しています。

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

...二重引用符で囲まれたテキストを一致させますが、単一引用符内の二重引用符のみを一致させる必要があることを修飾する方法がわかりませんでした。

4

3 に答える 3

3

識別子の区切り文字として二重引用符を受け入れるように MySQL を変更します。これは標準的な SQL の動作であり、SQL モードを使用して MySQL をそのように動作させることができます。

mysql> SET SQL_MODE = ANSI;

またはより具体的には:

mysql> SET SQL_MODE = ANSI_QUOTES;

次に、MySQL はデータ ダンプを理解する必要があります。

詳細については、「サーバー SQL モード」を参照してください。

于 2009-08-21T19:29:24.213 に答える
0

PHPで簡単に解決する方法を知っています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);

?>

Bill Karwinが言ったように、「SET SQL_MODE = ANSI_QUOTES」ができない限り。

于 2009-08-21T19:45:09.470 に答える
0

すべての二重引用符をバッククォートに置き換えることができ、mysql は問題なく動作します。

今のところ満足していますが、問題全体が解決したわけではないため、将来簡単に失敗する可能性があります. MySQL では、アポストロフィとバックスラッシュの動作も異なります。

製品情報のデータに二重引用符が含まれています。これらを置き換えから除外するにはどうすればよいですか?

確実にはできません。SQL 構文は実際には非常に複雑であり、通常、正規表現のハッキングによって解析することはできません。

既存の構文に合わせて SQL_MODE を変更するビルの提案は、はるかに優れたアプローチです。私は常に MySQL を ANSI モードで実行しています。アプリケーションを 1 つの特定のデータベースの欠点に合わせて調整する必要がないからです。

于 2009-08-21T19:49:52.707 に答える