SQLite的CREATE TABLE需改写为MySQL兼容格式:INTEGER→INT,TEXT→VARCHAR(255)或TEXT,BOOLEAN→TINYINT(1),DATETIME需校验格式,去掉IF NOT EXISTS,多列UNIQUE需显式命名约束。
SQLite 的 CREATE TABLE 语句怎么改写成 MySQL 兼容格式
sqlite 没有严格的数据类型约束,而 mysql 对类型、长度、约束更敏感,直接执行会报错,比如 integer primary key autoincrement 在 mysql 里要写成 int primary key auto_increment,且必须显式声明 not null。
常见转换要点:
-
TEXT→ 建议改为VARCHAR(255)或TEXT(MySQL 的TEXT有长度限制,大文本才用) -
BOOLEAN→ SQLite 里是整数模拟,MySQL 推荐用TINYINT(1),别用BOOL(只是别名) -
DATETIME→ MySQL 支持,但 SQLite 存的是字符串,导入前需确认格式是否为'YYYY-MM-DD HH:MM:SS',否则STR_TO_DATE()才能转 - 去掉
IF NOT EXISTS(MySQL 5.7+ 支持,但旧版不认;SQLite 里常用,导出时往往带上了) -
UNIQUE约束若跨多列,MySQL 要写成CONSTRAINT uk_name UNIQUE (col1, col2),不能只写UNIQUE(col1, col2)(部分版本不支持 inline 写法)
用 sqlite3 导出的 .sql 文件怎么清理再导入 MySQL
直接 sqlite3 my.db .dump > dump.sql 输出的是 SQLite 专用语法,含 PRAGMA、INSERT INTO ... VALUES(...) 中的单引号转义、无类型字段等,MySQL 客户端会卡在第一行就报错。
实操建议:
- 先删掉所有
PRAGMA行和BEGIN TRANSACTION/COMMIT(MySQL 导入不依赖它,反而干扰) - 把
INSERT INTO t VALUES(...)改成显式列名形式:INSERT INTO t (c1,c2) VALUES(...)—— 因为 SQLite 可能省略列,而 MySQL 表结构变更后容易错位 - 替换
''(两个单引号)为'(转义单引号),否则 MySQL 解析失败;可用sed "s/''/\'/g"快速处理 - 避免用
mysql -e "source dump.sql",改用mysql db_name ,更稳定,错误定位也清楚
中文乱码或特殊字符插入失败怎么办
SQLite 默认用 UTF-8,但导出文件可能没声明编码,MySQL 连接或表默认字符集却是 latin1,导致 INSERT 报 Incorrect string value 错误。
关键检查点:
- 导出文件本身用
file -i dump.sql确认是utf-8;不是就用iconv -f gbk -t utf-8 dump.sql > dump_utf8.sql转 - 建表时显式指定:结尾加
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci(别用utf8,那是 MySQL 的阉割版) - 连接 MySQL 时加参数:
mysql --default-character-set=utf8mb4 -u root -p db_name - 如果已有表,用
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci补救
大数据量导入时卡住或中断,怎么稳住
SQLite 导出的 INSERT 很多是单条语句,几万行就慢得离谱;MySQL 默认 autocommit=1,每条都刷盘,还容易触发超时或内存溢出。
提速兼防崩的操作:
- 在 SQL 文件开头加:
SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;,结尾加COMMIT; - 把连续的
INSERT合并成批量(如每 1000 行一个INSERT INTO t VALUES (...), (...), ...);可用 Python 脚本或awk处理,比手动快 - 临时调大 MySQL 配置:
max_allowed_packet=256M(避免大 INSERT 被截断),innodb_log_file_size=256M(减少 checkpoint 频率) - 导入完立刻运行:
SET unique_checks=1; SET foreign_key_checks=1;,再ANALYZE TABLE t;更新统计信息
类型映射和字符集这两块最容易被跳过,一出问题就反复重试。宁可多花十分钟检查导出文件头三行和最后十行,也别信“应该没问题”。


















