Alla verkar börja med några greps och perl-uttryck och du får typ något som fungerar för just din datauppsättning men du har ingen aning om det har importerats data korrekt eller inte. Jag är allvarligt förvånad över att ingen har byggt ett solidt bibliotek som kan konvertera mellan de två.
Här en lista över ALLA skillnader i SQL-syntax som jag känner till mellan de två filformaten:Raderna som börjar med:
- BÖRJA TRANSAKTIONEN
- ÅTGÄRDER
- sqlite_sequence
- SKAPA UNIKT INDEX
används inte i MySQL
- SQLite använder
CREATE TABLE/INSERT INTO "table_name"
och MySQL använderCREATE TABLE/INSERT INTO table_name
- MySQL använder inte citattecken i schemadefinitionen
- MySQL använder enkla citattecken för strängar i
INSERT INTO
klausuler - SQLite och MySQL har olika sätt att undvika strängar inuti
INSERT INTO
klausuler - SQLite använder
't'
och'f'
för booleans använder MySQL1
och0
(ett enkelt regex för detta kan misslyckas när du har en sträng som:'Jag gör det, du gör inte' i dinINSERT INTO
) - SQLLite använder
AUTOINCREMENT
, MySQL använderAUTO_INCREMENT
Här är ett mycket grundläggande hackat perl-skript som fungerar för min dataset och kontrollerar många fler av dessa tillstånd än andra perl-skript jag hittade på webben. Nu garanterar att det kommer att fungera för din data men ändra gärna och skicka tillbaka det här.
#! /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;
}
}