Изглежда, че всеки започва с няколко израза greps и perl и вие някак си получавате нещо, което работи за вашия конкретен набор от данни, но нямате представа дали данните са импортирани правилно или не. Сериозно съм изненадан, че никой не е изградил солидна библиотека, която може да конвертира между двете.
Ето списък на ВСИЧКИ разлики в синтаксиса на SQL, за които знам между двата файлови формата:Редовете, започващи с:
- ЗАПОЧНЕТЕ ТРАНЗАКЦИЯ
- ЗАДАВАНЕ
- sqlite_sequence
- СЪЗДАВАЙТЕ УНИКАЛЕН ИНДЕКС
не се използват в MySQL
- SQLite използва
CREATE TABLE/INSERT INTO "table_name"
и MySQL използваCREATE TABLE/INSERT INTO table_name
- MySQL не използва кавички в дефиницията на схемата
- MySQL използва единични кавички за низове вътре в
INSERT INTO
клаузи - SQLite и MySQL имат различни начини за избягване на низове в
INSERT INTO
клаузи - SQLite използва
't'
и'f'
за булеви, MySQL използва1
и0
(прост регулярен израз за това може да се провали, когато имате низ като:'I do, you don't' във вашияINSERT INTO
) - SQLLite използва
AUTOINCREMENT
, MySQL използваAUTO_INCREMENT
Ето един много основен хакнат perl скрипт, който работи за моя набор от данни и проверява за много повече от тези условия, които други скриптове на perl намерих в мрежата. Nu гарантира, че ще работи за вашите данни, но не се колебайте да променяте и публикувате отново тук.
#! /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;
}
}