【问题标题】:What really happens when I use varchar(10) in the sqlite command-line shell?当我在 sqlite 命令行 shell 中使用 varchar(10) 时会发生什么?
【发布时间】:2011-02-11 07:08:17
【问题描述】:

通过阅读一些 SQLite 文档,我第一次使用 SQLite。特别是,我在 Sourceforge 上使用 Command Line Shell For SQLite 和 SoupToNuts SQLite Tutorial

根据 SQLitedatatype documentation,SQLite 中只有 5 种数据类型。但是,在上面的两个教程文档中,我看到了作者在哪里使用了诸如

之类的命令
create table tbl1(one varchar(10), two smallint);
create table t1 (t1key INTEGER PRIMARY KEY,data TEXT,num double,timeEnter DATE);

其中包含 SQLite 未列出的数据类型,但这些命令可以正常工作。

此外,当我运行 .dump 查看 SQL 语句时,这些数据类型规范被保留:

sqlite> CREATE TABLE Vulnerabilities (
   ...> VulnerabilityID unsigned smallint primary key,
   ...> VulnerabilityName varchar(10),
   ...> VulnerabilityDescription longtext);
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE Vulnerabilities (
VulnerabilityID unsigned smallint primary key,
VulnerabilityName varchar(10),
VulnerabilityDescription longtext);
COMMIT;
sqlite>

那么,什么给了? SQLite 是否保留 SQL 中指定的任何数据类型的引用,但在幕后将其转换为其 5 种数据类型之一?还是我还缺少其他东西?

【问题讨论】:

    标签: sql sqlite types


    【解决方案1】:

    SQLite uses dynamic typing.
    SQLite 将允许您在 VARCHAR(10) 列中插入一个整数。
    如果在该列中插入超过 10 个字符的字符串,SQLite 不会报错。

    正如 el.pescado 所提到的,SQLite 具有存储类 AKA “亲和性”。
    如果您尝试插入属于 a particular affinity 的列,则 SQLite 将尝试转换该值以匹配亲和力。
    如果转换不起作用,则按原样插入值。

    因此,尽管(显然)将更细粒度的数据类型保存到元数据表中,但 SQLite 并未使用它们。

    【讨论】:

    • 仍然使用更细粒度的数据类型会是一件“好事”吗?
    • 除非您同时将数据定义语句 (DDL) 与其他 RDBMS 一起使用,否则我认为没有任何理由这样做。
    • 我在考虑是否可以将其移植到诸如 MySQL 或 SQL Express 之类的东西上。
    • 在这种情况下,使用更具体的类型是有意义的,这样您就不必在 DDL 语句中重写太多内容了。
    【解决方案2】:

    没有五种数据类型,而是“真实”数据类型所属的 5 种数据类型“类”。因此,TINYINT、SMALLINT 和 BIGINT 是三种不同的数据类型,但都属于 INTEGER 存储类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      相关资源
      最近更新 更多