MySQL 到 SQLite 迁移.我是否需要更新数据类型


MySQL to SQLite migration. Do I need to update the data types?

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

我更新了我们的 PDO 连接字符串,它继续工作了几周没有问题,但在使用 DB浏览器浏览数据库时,我遇到了一些奇怪的东西;似乎脚本没有更新数据类型以兼容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

这是怎么回事?

来自文档 -

SQLite本质上支持所谓的"类型亲和力"。SQLite执行诸如varchar之类的东西转换为text以进行存储。

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

SQLite 将亲和力分解为组(文本、数字、整数、实数、无( 每个组都遵循标准 SQL 数据类型进行这些列中的转换。

您不必在转换过程中更改数据类型,因为 SQLite 会识别并根据需要转换为其亲和力类型。

它之所以工作,是因为SQLite知道Mysql数据类型与哪些本机数据类型相似。这就是"亲和力名称"的原则。

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

为了进一步阅读,我建议您阅读文档,特别是属于标题亲和力名称示例的内容