共计 2096 个字符,预计需要花费 6 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 sqlite3 迁移 mysql 可能遇到的问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
问题列表
1、sqlite3 dump 出的各种变量在 mysql 不识别,如(BEGIN TRANSACTION、COMMIT 等等)
2、sqlite 数据库数据无法导出隐藏字段 rowid
3、sqlite 数据库数据导出格式与其他数据库不兼容, 如单引号、双引号问题
4、导出的 sqlite 数据不带列名,如下 INSERT INTO protocol VALUES(大类页(新),)。我们可能需要的是 INSERT INTO protocol(text1 , text2)VALUES(大类页(新), 刷新页)
5、特殊符号处理,如转义符 \
6、表字段长度限制不一样
7、数据量写入效率问题
问题解决
首先不能使用 sqliteStudio、Navicat 等工具,这里采用 shell 命令的方式,直接避免一下内容生成,
BEGIN TRANSACTION
COMMIT
CREATE UNIQUE INDEX
PRAGMA foreign_keys=OFF
同时使用 shell 方式可以用很少的代码量实现。
1、解决字段列名没有输出问题
运行 sqlite3 命令“pragma table_info(表名);“得到以下输出内容
0|name|TEXT|0||0
1|description|TEXT|0||0
再通过字符串替换得到列名,如下:
假设变量为 COLS = name,description
2、解决单引号、双引号问题
运行 sqlite3 命令“ .mode insert .dump 表名“得到如下输出内容
INSERT INTO 表名 VALUES(test , test
INSERT INTO 表名 VALUES(test , test
INSERT INTO 表名 VALUES(test , test
以这种方式可以解决单引号双引号问题,这里直接统一输出单引号
3、解决 sqlite3 默认字段 rowid 无法显示问题,这里直接将 rowid 改为 id
将当前模式设置为.dump insert 模式
运行 sqlite3 命令“select rowid as id,$COLS from 表名“得到如下输出
INSERT INTO 表名 VALUES(1, test , test
INSERT INTO 表名 VALUES(2, test , test
INSERT INTO 表名 VALUES(3, test , test
4、通过 shell 字符串命令,将之前得到的列名添加到以下 sql 语句
修改后如下:
INSERT INTO 表名(name , description)VALUES(1, test , test
INSERT INTO 表名(name , description)VALUES(2, test , test
INSERT INTO 表名(name , description)VALUES(3, test , test
5、转义符处理
如果数据库里的数据存在转义符, 如:{\ lastname\ :\\ 天津 \\}。这种数据如果不处理,那么将数据 insert 到数据库时会变成 {lastname :\ 天津 \}。所以需要对转义符做下处理,用 shell 命令处理很简单,如命令:sed s#\\#\\\\#g
方案实现
此脚本主要解决了以上 1~5 问题,根据需要可以对脚本进行修改
#!/bin/sh
SQLITE=sqlite3
if [ -z $1 ] ; then
echo usage: $0 sqlite3.db
exit
fi
DB= $1
TABLES=` $SQLITE $DB .tables`
for TABLE in $TABLES ; do
CREATE=` $SQLITE $DB SELECT sql FROM sqlite_master WHERE type=\ table\ AND name = \ $TABLE\ `
echo $CREATE |
cut -d = -f2 |
sed s/^CREATE TABLE $TABLE (/CREATE TABLE $TABLE (id int auto_increment primary key ,/g
COLS=` $SQLITE $DB pragma table_info($TABLE) | cut -d | -f2 `
COLS_CS=`echo $COLS | sed s/ /,/g `
echo .mode insert \n.header on \n select rowid as id,$COLS_CS from $TABLE;\n |
$SQLITE $DB |
sed s/^INSERT INTO \ table\ /INSERT INTO $TABLE /g |
sed s#\\#\\\\#g
done
以上是“sqlite3 迁移 mysql 可能遇到的问题有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!