2009-08-21 4 views
1

Ich bin eine sqlite3-Datenbank auf MySQL zu konvertieren.Regexp für Angebote in der Datenbank Insert-Anweisungen ersetzt

Ich habe eine nette Kommandodatei für sed, die benötigt AUTOINCREMEMT und die anderen Dinge verändert, aber ich bin auf den letzten stecken: doppelte Anführungszeichen.

sqlite3 Dump-Format:

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!') 

Zum ersten Aussage kann ich alle doppelte Anführungszeichen mit Backticks und MySQL werden gerne ersetzen.

Allerdings haben meine Produktinformation doppelte Anführungszeichen in den Daten. Wie kann ich diese vom Austauschen ausschließen? Ich habe versucht, nur diese doppelten Anführungszeichen mit einem Platzhalter zu ersetzen, dann könnte ich alle anderen doppelten Anführungszeichen ersetzen, dann könnte ich den Platzhalter zurück ändern, aber meine Regex-Fu ist nicht auf Par.

Das war, soweit ich bekam:

/"[^"]*"/s 

... die doppelten Anführungszeichen Texte übereinstimmen, aber ich kann nicht herausfinden, wie zu qualifizieren, dass nur doppelte Anführungszeichen in einfachen Anführungszeichen abgestimmt werden sollten.

+0

Stellen Sie sicher, entweder nicht haben, oder können die folgenden Fälle behandeln: * Apostrophe * einzelne Anführungszeichen entgangen, die eine Linie Endspanne Es könnte einfacher sein, all die einfachen Anführungszeichen mit einem anderen Charakter zu ersetzen, dann wandle sie zurück. Wie viele Instanzen hast du? Wenn Sie einen Import versuchen und Fehler ignorieren, können Sie die Fehler am Ende zählen. – TheJacobTaylor

Antwort

3

würde ich MySQL ändern doppelte Anführungszeichen als Bezeichner Begrenzungszeichen zu akzeptieren. Dies ist Standard-SQL-Verhalten, und Sie können MySQL auf diese Weise mit einer SQL-Modus verhalten sich machen:

mysql> SET SQL_MODE = ANSI; 

Oder genauer gesagt:

mysql> SET SQL_MODE = ANSI_QUOTES; 

Dann MySQL sollten Sie Ihre Daten-Dump verstehen.

Siehe "Server SQL Modes" für weitere Informationen.

+0

Nun, hey, ich habe diesen SET Befehl nie gegeben. Lass mich das überprüfen. – wesgarrison

0

Nun, ich weiß, wie leicht es mit preg_replace_callback() in PHP lösen:


<?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); 

?>

Es sei denn, Sie können "SET SQL_MODE = ANSI_QUOTES", wie Bill sagte Karwin.

0

Ich kann alle doppelten Anführungszeichen mit Backticks ersetzen und mysql wird glücklich sein.

Glücklich für jetzt, aber es hätte nicht das ganze Problem gelöst, so könnte leicht in der Zukunft fallen. Apostroph und Backslash funktionieren in MySQL auch anders.

Meine Produktinformationen haben doppelte Anführungszeichen in den Daten. Wie kann ich diese vom Austauschen ausschließen?

Sie können nicht zuverlässig. Die SQL-Syntax ist tatsächlich ziemlich komplex und kann im Allgemeinen nicht durch Regex-Hacking analysiert werden.

Bill Vorschlag SQL_MODE mit der Änderung der bestehenden Syntax zu passen ist ein viel besserer Ansatz. Ich benutze MySQL ständig im ANSI-Modus, da ich meine Apps nicht an die Schwächen einer bestimmten Datenbank anpassen kann.