2017-10-14 69 views
1

我想更好地学习SQL,所以我使用的sqlite3从头开始。当我试图将一个字符串值插入一个被指定为int的值时,它完美地工作。有人可以解释这可能吗?为什么我的字符串在sql db中被接受为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; 

回答

1

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

当定义列作为INTEGER,sqlite3的分配INTEGER向列型的亲和力。还有一个NUMERIC类型的亲和力。

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

和整数亲和力定义如下:

使用INTEGER亲和性的列的行为相同,与NUMERIC亲和性的柱。 INTEGER与NUMERIC亲和力之间的差异仅在CAST表达式中很明显。

在你的情况,sqlite3不会转换文本,但使用TEXT存储类来存储它。

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

0

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

(3)的SQLite让我插入一个字符串转换为整数类型的数据库列!

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

但SQLite确实使用列的声明类型作为您偏好该格式的值的提示。因此,例如,如果一列的类型为INTEGER,并且您尝试向该列中插入字符串,则SQLite将尝试将该字符串转换为整数。如果可以,它会插入整数。如果不是,则插入字符串。此功能称为类型关联。

0

根据docs

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

相关问题