我使用 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 的所有INT
、TINYINT
、BIGINT
都由 SQLite INTEGER
数据类型封装。
为了进一步阅读,我建议您阅读文档,特别是属于标题亲和力名称示例的内容