在SQLite中,以下语句将成功执行,并将字符串插入/更新到SALARY
类型为的列中INTEGER
:
update employee set salary='TOO MUCH' where emp_id=1;
请注意,不会插入/更新零,而是实际的“ TOO MUCH”字符串,因此这与认证类型转换无关。
常见问题解答指出:
这是一个功能,而不是错误。SQLite使用动态类型。它不强制执行数据类型约束。任何类型的数据(通常)都可以插入任何列中。您可以将任意长度的字符串放入整数列,布尔列中的浮点数或字符列中的日期。您在CREATE TABLE命令中分配给列的数据类型不限制可以在该列中放入哪些数据。每列都可以容纳任意长度的字符串。(有一个例外:INTEGER PRIMARY KEY类型的列只能包含一个64位有符号整数。如果尝试将一个整数以外的任何内容放入INTEGER PRIMARY KEY列,则会导致错误。)
因此,这种行为显然是故意的,但是我想知道为什么 SQLite会有这种行为,因为我所知道的大多数其他SQL数据库的行为都大不相同,因此,当尝试将非数字字符串插入到数据库中时,它们将引发错误或将字符串转换为0一个数字列。
如果没有这种行为,SQLite库会不会有用呢?
这是设计使图书馆小而又快吗?
尝试在数字列中插入字符串时,SQLite库会明显变慢还是变大,以引起错误?