2009-08-21 5 views
1

Je convertis une base de données sqlite3 en mysql.Regexp pour remplacer les guillemets dans les instructions d'insertion de base de données

J'ai un bon fichier de commande pour sed qui modifie AUTOINCREMEMT et les autres choses nécessaires, mais je suis coincé sur le dernier: guillemets doubles.

sqlite3 format de sauvegarde:

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

Pour la première déclaration, je peux remplacer tous avec des guillemets doubles et MySQL contre-apostrophes heureux.

Cependant, les informations sur mon produit comportent des guillemets dans les données. Comment puis-je exclure ces éléments d'être remplacés? J'essayais de remplacer seulement ces doubles guillemets par un espace réservé, alors je pourrais remplacer toutes les autres guillemets doubles, alors je pourrais changer l'espace réservé, mais mon regex-fu n'est pas à la hauteur.

C'était aussi loin que je suis:

/"[^"]*"/s 

... pour faire correspondre les textes cités doubles, mais je ne pouvais pas comprendre comment qualifier que seuls les guillemets doubles à l'intérieur des guillemets simples doivent être adaptées.

+0

Assurez-vous que soit vous n'avez pas, ou ne peut traiter les cas suivants: * échappées apostrophes * des chaînes entre guillemets simples qui couvrent une fin de ligne Il pourrait être plus facile de remplacer tous les guillemets simples avec un autre personnage, puis les convertir en arrière. Combien de cas avez-vous? Si vous tentez une importation et que vous l'ignorez, vous pouvez compter les erreurs à la fin. – TheJacobTaylor

Répondre

3

Je voudrais changer MySQL pour accepter les guillemets doubles comme délimiteurs d'identificateur. Ce comportement est standard SQL, et vous pouvez MySQL se comporte de cette façon avec un mode SQL:

mysql> SET SQL_MODE = ANSI; 

Ou plus précisément:

mysql> SET SQL_MODE = ANSI_QUOTES; 

Ensuite MySQL devrait comprendre votre décharge de données.

Voir "Server SQL Modes" pour plus d'informations.

+0

Eh bien, hé, je n'ai jamais cette commande SET existé. Laissez-moi vérifier cela. – wesgarrison

0

Eh bien, je sais comment résoudre facilement en PHP avec 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); 

?>

Sauf si vous pouvez "SET SQL_MODE = ANSI_QUOTES" comme Bill Karwin dit.

0

Je peux remplacer toutes les guillemets par des guillemets et mysql sera heureux.

Heureux pour l'instant, mais il n'aurait pas résolu tout le problème, donc pourrait facilement tomber à l'avenir. Apostrophe et backslash fonctionnent également différemment dans MySQL.

mes informations de produit ont des guillemets dans les données. Comment puis-je exclure ces éléments d'être remplacés?

Vous ne pouvez pas être fiable. La syntaxe SQL est en fait assez complexe, et ne peut pas dans le cas général être analysée par regex hacking.

La suggestion de Bill avec la modification de SQL_MODE pour s'adapter à la syntaxe existante est une bien meilleure approche. Je cours MySQL en mode ANSI tout le temps, car je n'aime pas avoir à adapter mes applications aux faiblesses d'une base de données particulière.

Questions connexes