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 INTOKlauseln - SQLite und MySQL haben unterschiedliche Möglichkeiten, Zeichenfolgen innerhalb von
INSERT INTOzu maskieren Klauseln - SQLite verwendet
't'und'f'für boolesche Werte verwendet MySQL1und0(Eine einfache Regex dafür kann fehlschlagen, wenn Sie eine Zeichenfolge wie:'I do, you don't' in IhremINSERT INTOhaben ) - SQLLite verwendet
AUTOINCREMENTverwendet 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;
}
}