我的一个私人日记站点放在DO,感觉太奢侈了,所以我就转移到以前剁手买的64M VPS上算了,但是装PHP扩展的时候忘记加上PHP-MYSQLI了,所以索性用SQLite了,还能省资源。但是找来找去都没有发现什么好的转换工具。于是爬墙上谷歌搜了搜,发现了个神器ESF Database Migration Toolkit - Professional,当然,名字看起来这么高大上的软件是个收费软件,DUANG~加了特技,我们就能免费“试”用了。

当然,如果你想尊重别人的劳动成果你可以购买正版的ESF Database Migration Toolkit - Professional或者使用这个转换脚本

从MySQL导出数据

1、一般人都使用phpMyAdmin来管理数据库,phpMyAdmin是个很方便的数据库管理工具。
phpMyAdmin导出数据库
2、在phpMyAdmin选在需要导出的表然后选择导出就可以将数据库导出到本地。

3、如果你没使用phpMyAdmin,则可以使用下面的命令来DUMP(导出)数据库:

tammy@my-laptop:~$ mysqldump -u root -p --compatible=ansi --skip-opt generator > dumpfile

使用ESF Database Migration Toolkit转换MySQL数据库为SQLite数据库

1、ESF Database Migration Toolkit - Professional特别版的下载地址

http://pan.baidu.com/s/1eQH3jJc

2、下载安装自行解决,不详细说了。

3、打开ESF Database Migration Toolkit - Professional会直接进入向导界面。

4、填写好源数据库信息就可以点下一步继续了,别忘了在phpMyAdmin的界面给相应的用户添加远程访问的权限。

转换MySQL数据库为SQLite数据库01

4、接着选择输出格式,这个软件可支持N种数据库进行互换。

转换MySQL数据库为SQLite数据库02

5、点NEXT继续。选择需要转换的数据表和视图。

转换MySQL数据库为SQLite数据库03

6、点NEXT进入抓换环节,点Submit开始转换,转换完就可以点Exit退出了。

转换MySQL数据库为SQLite数据库04

MySQL转SQLite脚本

#!/bin/bash
if [ "x$1" == "x" ]; then
  echo "Usage: $0 <dumpname>"
  exit
fi
cat $1 |
grep -v ' KEY "' |
grep -v ' UNIQUE KEY "' |
grep -v ' PRIMARY KEY ' |
sed '/^SET/d' |
sed 's/ unsigned / /g' |
sed 's/ auto_increment/ primary key autoincrement/g' |
sed 's/ smallint([0-9]*) / integer /g' |
sed 's/ tinyint([0-9]*) / integer /g' |
sed 's/ int([0-9]*) / integer /g' |
sed 's/ character set [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ on update [^,]*//g' |
sed 's/\\r\\n/\\n/g' |
sed 's/\\"/"/g' |
perl -e 'local $/;$_=<>;s/,\n\)/\n\)/gs;print "begin;\n":stuck_out_tongue_winking_eye:rint;print "commit;\n"' |
perl -pe '
if (/^(INSERT.+?)\(/) {
  $a=$1;
  s/\\'\''/'\'\''/g;
  s/\\n/\n/g;
  s/\),\(/\);\n$a\(/g;
}
' > $1.sql
cat $1.sql | sqlite3 $1.db > $1.err
ERRORS=`cat $1.err | wc -l`
if [ $ERRORS == 0 ]; then
  echo "Conversion completed without error. Output file: $1.db"
  rm $1.sql
  rm $1.err
else
  echo "There were errors during conversion.  Please review $1.err and $1.sql for details."
fi

1、将上边的代码保存为mysql-to-sqlite.sh。

2、在shell中可以直接转换MySQL的dumpfile为SQLite数据库。

tammy@my-laptop:~$ mysql-to-sqlite.sh dumpfile

Sqlite和MySQL的语法差异

1、SQLite标记为Not Null的字段必须非空或指定默认值,否则会报错。(需要特别注意AUTO_INCEMENT的属性)。

Sqlite和MySQL的语法差异

2、通过UPDATE语句修改数据时不能LIMIT 1

3、更多的我也不知道了。

修改程序代码以适应SQLite数据库

1、由于我使用的Typecho能使用SQLite数据库的,所以修改一下配置文件config.inc.php就可以了。原来MySQL的配置如下:

$db = new Typecho_Db('Mysql', 'typecho_');
$db->addServer(array (
  'host' => 'localhost',
  'user' => '***',
  'password' => '***',
  'charset' => 'utf8',
  'port' => '3306',
  'database' => '***',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

修改为下面这样的就可以了(如果是SQLite3请将Sqlite关键字修改为Pdo_SQLite)

$db = new Typecho_Db('SQLite', 'typecho_');
$db->addServer(array (
  'file' => '***',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);</pre>
2、如果你是使用别的程序误入这里,这里给出几个常见的SQL语句的对应关系,这不是我写的,来自[这里](http://www.360doc.com/content/11/0321/11/59141_103110951.shtml)
1.  mysql_real_escape_string - sqlite_escape_string
2.  mysql_query - sqlite_query / sqlite_exec
3.  mysql_insert_id - sqlite_last_insert_rowid
4.  mysql_error - sqlite_error_string
5.  mysql_errno - sqlite_last_error
6.  mysql_affected_rows - sqlite_changes

##  从MySQL数据库向SQLite迁移小结
1、这是个很小众的迁移方向,相关中文资料我也只找到一篇,最后还是Googling出来好办法的,专业问题还是要Google才行啊。