Jeder scheint mit ein paar Greps- und Perl-Ausdrücken zu beginnen, und Sie bekommen irgendwie etwas, das für Ihren speziellen Datensatz funktioniert, aber Sie haben keine Ahnung, ob die Daten korrekt importiert wurden oder nicht. Ich bin ernsthaft überrascht, dass niemand eine solide Bibliothek erstellt hat, die zwischen den beiden konvertieren kann.
Hier eine Liste ALLER mir bekannten Unterschiede in der SQL-Syntax zwischen den beiden Dateiformaten:Die Zeilen beginnend mit:
- TRANSAKTION BEGINNEN
- VERPFLICHTEN
- sqlite_sequence
- EINZIGARTIGEN INDEX ERSTELLEN
werden in MySQL nicht verwendet
- SQLite verwendet
CREATE TABLE/INSERT INTO "table_name"
und MySQL verwendetCREATE TABLE/INSERT INTO table_name
- MySQL verwendet keine Anführungszeichen innerhalb der Schemadefinition
- MySQL verwendet einfache Anführungszeichen für Zeichenfolgen innerhalb von
INSERT INTO
Klauseln - SQLite und MySQL haben unterschiedliche Möglichkeiten, Zeichenfolgen innerhalb von
INSERT INTO
zu maskieren Klauseln - SQLite verwendet
't'
und'f'
für boolesche Werte verwendet MySQL1
und0
(Eine einfache Regex dafür kann fehlschlagen, wenn Sie eine Zeichenfolge wie:'I do, you don't' in IhremINSERT INTO
haben ) - SQLLite verwendet
AUTOINCREMENT
verwendet MySQLAUTO_INCREMENT
Hier ist ein sehr einfaches, gehacktes Perl-Skript, das für my funktioniert Datensatz und prüft auf viele weitere dieser Bedingungen als andere Perl-Skripte, die ich im Internet gefunden habe. Nu garantiert, dass es für Ihre Daten funktioniert, aber Sie können es gerne ändern und hier zurück posten.
#! /usr/bin/perl
while ($line = <>){
if (($line !~ /BEGIN TRANSACTION/) && ($line !~ /COMMIT/) && ($line !~ /sqlite_sequence/) && ($line !~ /CREATE UNIQUE INDEX/)){
if ($line =~ /CREATE TABLE \"([a-z_]*)\"(.*)/i){
$name = $1;
$sub = $2;
$sub =~ s/\"//g;
$line = "DROP TABLE IF EXISTS $name;\nCREATE TABLE IF NOT EXISTS $name$sub\n";
}
elsif ($line =~ /INSERT INTO \"([a-z_]*)\"(.*)/i){
$line = "INSERT INTO $1$2\n";
$line =~ s/\"/\\\"/g;
$line =~ s/\"/\'/g;
}else{
$line =~ s/\'\'/\\\'/g;
}
$line =~ s/([^\\'])\'t\'(.)/$1THIS_IS_TRUE$2/g;
$line =~ s/THIS_IS_TRUE/1/g;
$line =~ s/([^\\'])\'f\'(.)/$1THIS_IS_FALSE$2/g;
$line =~ s/THIS_IS_FALSE/0/g;
$line =~ s/AUTOINCREMENT/AUTO_INCREMENT/g;
print $line;
}
}