iga*_*gal 9 sqlite integer unicode
我是一个数据库新手,正在查看似乎将文本存储在整数列中的 SQLite 数据库。这是 sqlite3 命令行中的示例会话:
sqlite> .schema mytable
CREATE TABLE mytable (
id integer primary key, /* 0 */
mycol integer not null, /* 1 */
);
sqlite> SELECT mycol FROM mytable;
here is some text
here is more text
[...]
it's text all the way down
Run Code Online (Sandbox Code Playgroud)
我糊涂了。是什么赋予了?
Vér*_*ace 13
这是 SQLite 众所周知的“怪癖”。
SQLite 使用它所谓的动态类型系统,这最终意味着您可以将文本存储在整数字段中 - 在 Oracle、SQL Server 和数据库世界中的所有其他大热门中,尝试这样做会失败 - 而不是 SQLite。
看看这里:
SQLite 使用更通用的动态类型系统。在 SQLite 中,值的数据类型与值本身相关联,而不是与其容器相关联。SQLite 的动态类型系统向后兼容其他数据库引擎的更常见的静态类型系统,因为在静态类型数据库上工作的 SQL 语句应该在 SQLite 中以相同的方式工作。然而,SQLite 中的动态类型允许它做在传统的严格类型数据库中是不可能的事情。
此处概述了该系统的优点。
注意:数据类型限制可能很麻烦,尤其是当您在 SQL 中添加持续时间、日期或此类性质的内容时。SQLite 很少有内置函数用于这类事情。但是,SQLite 确实为您提供了一种简单的方法来制作自己的内置函数来添加持续时间和类似性质的东西,
我认为 SQLite 的观点有点像关于 C 编程语言的引用 -
“C 允许你做非常愚蠢的事情,因为它也允许你做非常聪明的事情。”
SQLite 也是如此。
查看上面引用的整个 StackOverflow 线程。
SQLite 中的数据类型更像是“提示”而不是命令。