我使用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
这是怎么回事?
答案 0 :(得分:3)
来自docs -
SQLite基本上支持所谓的"类型亲和力"。为了存储目的,SQLite会执行varchar
到text
之类的转换。
具有TEXT亲缘关系的列使用存储类NULL,TEXT或BLOB存储所有数据。如果将数字数据插入到具有TEXT亲和力的列中,则在存储之前将其转换为文本形式。
SQLite将亲和力分解为组(TEXT,NUMERIC,INTEGER,REAL,NONE) 并且每个组都尊重标准SQL数据类型以便在这些列中进行转换。
您不必在转换过程中更改数据类型,因为SQLite会根据其关联类型识别并转换。
答案 1 :(得分:0)
它工作的原因是因为SQLite知道Mysql数据类型与哪些本机数据类型相似。这是“亲和名称”的原则。
例如,Mysql的所有INT
,TINYINT
,BIGINT
都由SQLite INTEGER
数据类型封装。
为了进一步阅读,我建议您阅读文档,特别是标题Affinity name examples
的内容