В SQLite следующий оператор будет успешным, и строка будет вставлена / обновлена в SALARY
столбце, который имеет тип INTEGER
:
update employee set salary='TOO MUCH' where emp_id=1;
Обратите внимание, что ноль не будет вставлен / обновлен, но будет содержать фактическую строку «СЛИШКОМ МНОГО» , так что речь идет не об автоматическом преобразовании типов.
В FAQ говорится:
Это особенность , а не ошибка. SQLite использует динамическую типизацию. Он не применяет ограничения типов данных. Данные любого типа могут (обычно) вставляться в любой столбец. Вы можете поместить строки произвольной длины в целочисленные столбцы, числа с плавающей запятой в логических столбцах или даты в символьных столбцах. Тип данных, который вы назначаете столбцу в команде CREATE TABLE, не ограничивает данные, которые могут быть помещены в этот столбец. Каждый столбец может содержать строку произвольной длины. (Существует одно исключение: столбцы типа INTEGER PRIMARY KEY могут содержать только 64-разрядное целое число со знаком. Ошибка будет возникать, если вы попытаетесь поместить в столбец INTEGER PRIMARY KEY что-то кроме целого.)
Так что это поведение явно преднамеренное, тем не менее, мне интересно, почему SQLite имеет такое поведение, так как большинство других баз данных SQL, о которых я знаю, ведут себя совершенно иначе, они вызовут ошибку или преобразуют строку 0 при попытке вставить нечисловую строку в числовой столбец.
Будет ли библиотека SQLite менее полезной без такого поведения?
Это сделано так, чтобы библиотека была маленькой и быстрой?
Будет ли библиотека SQLite значительно медленнее или больше, чтобы возникли ошибки при попытке вставить строку в числовой столбец?