Alle lader til at starte med et par greps og perl-udtryk, og du får sådan set noget, der virker til dit bestemte datasæt, men du aner ikke, om det er importeret dataene korrekt eller ej. Jeg er seriøst overrasket over, at ingen har bygget et solidt bibliotek, der kan konvertere mellem de to.
Her er en liste over ALLE forskelle i SQL-syntaks, som jeg kender til mellem de to filformater:Linjerne der starter med:
- BEGIN TRANSAKTIONEN
- KOMMITTER
- sqlite_sequence
- OPRET UNIKT INDEKS
bruges ikke i MySQL
- SQLite bruger
CREATE TABLE/INSERT INTO "table_name"
og MySQL brugerCREATE TABLE/INSERT INTO table_name
- MySQL bruger ikke anførselstegn i skemadefinitionen
- MySQL bruger enkelte anførselstegn for strenge inde i
INSERT INTO
klausuler - SQLite og MySQL har forskellige måder at undslippe strenge inde i
INSERT INTO
klausuler - SQLite bruger
't'
og'f'
for booleans bruger MySQL1
og0
(et simpelt regex for dette kan mislykkes, når du har en streng som:'Det gør jeg, du gør ikke' inde i dinINSERT INTO
) - SQLLite bruger
AUTOINCREMENT
, MySQL brugerAUTO_INCREMENT
Her er et meget grundlæggende hacket perl-script, som virker for min datasæt og kontrollerer for mange flere af disse forhold end andre perl-scripts, jeg fandt på nettet. Nu garanterer, at det vil fungere for dine data, men du er velkommen til at ændre og skrive tilbage her.
#! /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;
}
}