sqlite3迁移mysql可能遇到的问题集合

 更新时间:2019年07月15日 14:44:38   作者:栗庆  
这篇文章主要给大家介绍了关于sqlite3迁移mysql可能遇到的问题集合,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

简述

适合阅读对象:移动开发

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • mysql的3种分表方案

    mysql的3种分表方案

    这篇文章主要介绍了mysql的3种分表方案,先从为什么要分表说起,然后分析了3种方法的优劣势,最后做了一个总结,需要的朋友可以参考下
    2014-05-05
  • Linux系统下Mysql使用简单教程(一)

    Linux系统下Mysql使用简单教程(一)

    这篇文章主要介绍了Linux系统下Mysql使用简单教程(一)的相关资料,需要的朋友可以参考下
    2016-05-05
  • MySQL数据库十大优化技巧

    MySQL数据库十大优化技巧

    WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是一个大问题。希望本文能对大家掌握MySQL优化技巧有所帮助。
    2011-03-03
  • com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别

    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver&n

    大家在连接mysql的时候,启动项目,会警告你推荐使用com.mysql.cj.jdbc.Driver 而不是com.mysql.jdbc.Driver,本文主要介绍了com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • MySQL数据库所在服务器磁盘满了的故障分析和解决方法

    MySQL数据库所在服务器磁盘满了的故障分析和解决方法

    这篇文章主要给大家介绍了MySQL数据库所在服务器磁盘满了的故障分析和解决方法,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Mybatis的where标签使用总结梳理

    Mybatis的where标签使用总结梳理

    这篇文章主要介绍了Mybatis的where标签使用总结梳理,文章通过将Mybatis中where标签的基本使用形式展开where标签小技巧以及容易踩到的坑进行总结梳理,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 通过mysql show processlist 命令检查mysql锁的方法

    通过mysql show processlist 命令检查mysql锁的方法

    show processlist 命令非常实用,有时候mysql经常跑到50%以上或更多,就需要用这个命令看哪个sql语句占用资源比较多,就知道哪个网站的程序问题了。
    2010-03-03
  • 用Autoconf检测MySQL软件包的教程

    用Autoconf检测MySQL软件包的教程

    这篇文章主要介绍了用Autoconf检测MySQL软件包的教程,主要使用编写好的ax_lib_mysql脚本进行操作,需要的朋友可以参考下
    2015-06-06
  • MySQL数据库21条最佳性能优化经验

    MySQL数据库21条最佳性能优化经验

    数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。这篇文章主要介绍了MySQL数据库21条最佳性能优化经验的相关资料,需要的朋友可以参考下
    2016-10-10
  • MySQL中常用查看锁和事务的SQL语句详解

    MySQL中常用查看锁和事务的SQL语句详解

    这篇文章主要介绍了MySQL中常用查看锁和事务的SQL语句,用于查看锁和事务的状态,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论