为什么我的字符串被接受为sql db中的int值?

时间:2017-10-14 22:14:17

标签: sql sqlite

我正在努力学习SQL,所以我从一开始就使用sqlite3。当我试图将一个字符串值插入一个指定为int的值时,它完美地工作。有人能解释一下这是怎么回事吗?

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE entertainment(num INT, show TEXT, myRating INT);
INSERT INTO "entertainment" VALUES(1,'Mr. Robot',10);
INSERT INTO "entertainment" VALUES(7,'Narcos','el classic');
INSERT INTO "entertainment" VALUES(8,'Suits',7);
INSERT INTO "entertainment" VALUES(9,'Friends',"classic");
COMMIT;

3 个答案:

答案 0 :(得分:1)

Sqlite3在这方面非常灵活。简而言之,无论您指定的类型如何,sqlite3都会根据需要转换数据或将其存储为数据。但是,通过指定数据类型,sqlite3将使用该信息尽可能有效地存储数据。

将列定义为INTEGER时,sqlite3会为列分配INTEGER的类型亲缘关系。还有NUMERIC类型的亲和力。

  

具有NUMERIC亲缘关系的列可能包含使用所有五个存储类的值。当文本数据插入NUMERIC列时,如果此类转换是无损且可逆的,则文本的存储类将转换为INTEGER或REAL(按优先顺序)。对于TEXT和REAL存储类之间的转换,如果保留数字的前15个有效十进制数字,SQLite认为转换是无损且可逆的。如果无法将TEXT无损转换为INTEGER或REAL,则使用TEXT存储类存储该值。不会尝试转换NULL或BLOB值。

INTEGER亲和力定义如下:

  

使用INTEGER亲和关系的列的行为与具有NUMERIC亲缘关系的列的行为相同。 INTEGER和NUMERIC亲和力之间的区别仅在CAST表达式中明显。

在您的情况下,sqlite3不会转换文本,而是使用TEXT存储类存储它。

有关数据类型,存储类和类型关联的更多详细信息,请参阅SQLite参考中的Datatypes页面。

答案 1 :(得分:0)

https://sqlite.org/faq.html#q3

  

(3)SQLite允许我将一个字符串插入一个整数类型的数据库列中。

     

这是一个功能,而不是一个bug。 SQLite使用动态类型。它不强制实施数据类型约束。任何类型的数据都可以(通常)插入任何列。您可以将任意长度字符串放入整数列,布尔列中的浮点数或字符列中的日期。您在CREATE TABLE命令中为列分配的数据类型不会限制可以将哪些数据放入该列。每列都能容纳一个任意长度的字符串。 (有一个例外:INTEGER PRIMARY KEY类型的列只能保存64位有符号整数。如果尝试将除整数之外的任何内容放入INTEGER PRIMARY KEY列,将导致错误。)

     

但SQLite确实使用声明的列类型作为提示,您更喜欢该格式的值。因此,例如,如果列的类型为INTEGER,并且您尝试将字符串插入该列,则SQLite将尝试将该字符串转换为整数。如果可以的话,它会插入整数。如果没有,则插入字符串。此功能称为类型亲和力。

答案 2 :(得分:0)

根据docs

  

这是一个功能,而不是一个bug。 SQLite使用动态类型。它不强制实施数据类型约束。任何类型的数据都可以(通常)插入任何列。您可以将任意长度字符串放入整数列,布尔列中的浮点数或字符列中的日期。