Чи був би SQLite менш корисним, не приймаючи в числові стовпці вставки нечислових значень?


10

У SQLite наступне твердження було б успішним, і рядок буде вставлено / оновлено у SALARYстовпчик типу INTEGER:

update employee set salary='TOO MUCH' where emp_id=1;

Зауважте, що нуль не буде вставлено / оновлено, а фактична рядок "TOO MUCH" , тому мова не йде про автоматичне перетворення типу.

FAQ задає:

Це особливість , а не помилка. SQLite використовує динамічне введення тексту. Він не застосовує обмежень типу даних. Дані будь-якого типу можна (як правило) вставляти в будь-який стовпець. Ви можете розмістити рядки довільної довжини в цілі стовпці, числа з плаваючою точкою в булевих стовпцях або дати в стовпці символів. Тип даних, який ви призначаєте стовпцю в команді CREATE TABLE, не обмежує, які дані можна ввести у цей стовпець. Кожен стовпець може містити довільну довжину рядка. (Є один виняток: стовпці типу INTEGER PRIMARY KEY можуть містити лише 64-розрядне ціле число, підписане. Помилка виникла, якщо ви спробуєте вставити що-небудь, крім цілого числа, у стовпець INTEGER PRIMARY KEY.)

Тож ця поведінка явно навмисна, проте мені цікаво, чому SQLite має таку поведінку, оскільки більшість інших баз даних SQL, про які я знаю, поводяться зовсім інакше, вони підняли б помилку або перетворили рядок 0, намагаючись вставити нечисловий рядок у числовий стовпчик.

  • Чи була б бібліотека SQLite менш корисною без такої поведінки?

  • Це зроблено так, щоб зробити бібліотеку маленькою і швидкою?

  • Чи буде бібліотека SQLite значно повільнішою чи більшою, щоб наробити помилки під час спроби вставити рядок у числовий стовпець?


9
Хтось одного разу сказав, що "функція - це помилка, як описано відділом маркетингу".
Ден Пішельман

3
Я сумніваюся, що це добре для продуктивності та щільності даних, хоча може бути корисним для розміру коду. Взагалі, я б назвав це навмисною (або принаймні, прийнятою) помилковою ознакою.
Дедуплікатор

3
"Мені здається накладеним обмеженням для того, щоб залишатися бібліотекою з невеликими розмірами, з невеликими ресурсами, яка зазвичай використовується для вбудованої системи, яка вимагає продуктивності в режимі реального часу ..." Я не можу уявити, щоб перевірка типу була нічим іншим, ніж падінням час / простір відра для операцій, які виконують будь-яку кількість дискового вводу. Крім того, вони повинні мати додаткові перевірки в коді, оскільки вони не можуть просто припустити, що дані матимуть фіксований розмір, тому, напевно, динамічне набір тексту коштує вашої продуктивності.
Doval

1
@DocBrown Не тому, що я так кажу, але тому, що це sui generis .
Tulains Córdova

2
@ user61852 Я пропоную вам переписати питання повністю і зосередитись на тому, чи зможе динамічна типізація SQLite принести їй переваги продуктивності, а також пропустити будь-яку згадку про особливість / помилку або загальну корисність / непотрібність динамічного введення тексту в контексті X або Y.
Doval

Відповіді:


8

Ні, динамічне введення тексту вимагає як більше місця для зберігання, так і більше часу на обробку, тим більше, що вони також додають спорідненість до типу, це означає, що він має кращий тип, який програміст може ігнорувати. Це справді цілеспрямована функція з реальними комерційними витратами. Ці витрати фактично незначні для випадків використання цілей SQLite, але вони все ще є.

Корисність таких функцій важко помітити, тому що ви не звикли мати її доступною для вас. Вирішення його нестачі зараз для вас більш природно. Через ваш попередній досвід ви розглядаєте це як ціле поле INTEGER, яке ніколи не буде нічого іншого, але SQLite сприймає це більше як поле будь-якого типу, але, ймовірно, буде містити цілі числа. Можливо, це поштовий індекс для компанії, яка в основному займається бізнесом у США, але має кілька канадських клієнтів. Дозволити користувачеві вказати цілісні спорідненості, це заощадить багато місця над тим, щоб зробити його рядком у кожному рядку, але все ж надасть вам цей варіант.


3
Я написав оновлення до свого питання про успішне зберігання рядка " ТОГО МНОГО " в числовій колонці. Автоматичне перетворення вставило б нуль. Крім того, це перша реалізація реляційних баз даних, що я знаю, що це дозволить. Я працював з MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL і Sybase SQL Anywhere.
Tulains Córdova

2
Я не розумію вашого коментаря. Нічого щодо моєї відповіді не мало нічого спільного з автоматичним перетворенням.
Карл Білефельдт

1
SQLite вважає їх класами зберігання замість типів даних. sqlite.org/datatype3.html
JeffO

1
Upvoted за те , що ясно написано, але які ігнорують проблеми , це викликає в доказі точності даних. Ви не можете витягти деякі цілі числа зі своєї БД і припускати, що вони будуть цілими числами. ("Динамічне введення тексту" дико суперечить власне реляційній моделі .)
Уайлдкард

1
Витрати на повністю ігнорування введення тексту набагато вищі, ніж невеликий обсяг пам’яті та час процесора.
DeadMG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.