MySQL到SQLite的迁移。我需要更新数据类型吗?

时间:2014-12-18 14:32:56

标签: php mysql sqlite

我使用mysql2sqlite.sh将我们的应用程序从MySQL迁移到SQLite。

我更新了我们的PDO连接字符串并且它在几周内没有问题地继续工作但是在使用 DB Browser for SQLite 浏览数据库时,我遇到了一些奇怪的事情;看起来脚本没有将数据类型更新为SQLite兼容,但它仍然可以继续工作。这是怎么回事?

CREATE TABLE `events` (
    `id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    `Forename`  varchar(255) NOT NULL,
    `Surname`   varchar(255) NOT NULL,
    `Site`  TEXT,
    `Badge` varchar(255) NOT NULL,
    `Start` datetime NOT NULL,
    `End`   datetime NOT NULL,
    `Created`   timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);

在使用MySQL数据类型时,它如何继续正常工作?

根据SQLite文档,大多数这些数据类型都不存在于SQLite中,但它仍然有效。

我应该将数据类型更改为TEXT还是SQLite支持的其他内容?

更新

根据SQLite文档,这些是数据类型:

INTEGER
TEXT
BLOB
REAL
NUMERIC

但使用以下内容继续有效:

varchar(255)
datetime
timestamp

这是怎么回事?

2 个答案:

答案 0 :(得分:3)

来自docs -

SQLite基本上支持所谓的"类型亲和力"。为了存储目的,SQLite会执行varchartext之类的转换。

  

具有TEXT亲缘关系的列使用存储类NULL,TEXT或BLOB存储所有数据。如果将数字数据插入到具有TEXT亲和力的列中,则在存储之前将其转换为文本形式。

SQLite将亲和力分解为组(TEXT,NUMERIC,INTEGER,REAL,NONE)  并且每个组都尊重标准SQL数据类型以便在这些列中进行转换。

您不必在转换过程中更改数据类型,因为SQLite会根据其关联类型识别并转换。

答案 1 :(得分:0)

它工作的原因是因为SQLite知道Mysql数据类型与哪些本机数据类型相似。这是“亲和名称”的原则。

例如,Mysql的所有INTTINYINTBIGINT都由SQLite INTEGER数据类型封装。

为了进一步阅读,我建议您阅读文档,特别是标题Affinity name examples

的内容