Vadim Belyaev Profile picture
Jul 4, 2020 15 tweets 4 min read
Сегодня я случайно решил почитать документацию по SQLite. Я офигел и прозрел. Если вкратце, то SQLite — это такой джаваскрипт в мире баз данных. Тред с весёлыми запросами в консоли:
1. В SQLite, как и в любой БД, полям таблиц задают типы. Но можно записать значение любого типа в любое поле. SQLite его сконвертирует в нужный тип, а если не сможет, запишет как есть. Image
2. Неявное приведение типов можно не заметить, пока явно не проверишь функцией typeof(). Видно, что строка '42' сконвертировалась в целое число 42, потому что у поля тип INTEGER, а число 33950 записалось строкой. Image
3. В SQLite у поля может вообще не быть типа! Тогда оно будет просто хранить любые значения как есть без конвертации типов. Image
4. Названия типов в SQLite могут быть любыми! 😱 Вот я создаю таблицу с полями a, b и c, у которых типа SMOOTHIE, TOASTER и POPCORN: Image
5. SQLite по названию типа тупо поиском по подстроке назначает ему так называемый Type Affinity, то есть к какому типу данных будет "тяготеть" это поле, когда в него вставляют значения. А от этого уже зависит, какими способами данные будут храниться на диске.
6. Если в названии типа содержится INT, то поле будет стремиться преобразовать вставляемые значения в целые числа и хранить их в ячейке размером от 1 до 8 байт в зависимости от величины числа. Ну а если не получится преобразовать, так в другом подходящем виде, как мы видели выше.
7. Аналогично, если есть CHAR, CLOB или TEXT, то поле будет стараться хранить всё в виде строк. Если BLOB или тип не задан, то как бинарные данные. REAL, FLOA или DOUB — как числа с плавающей точкой.
8. Наконец, если ни одно из предыдущих правил не сработало, поле получает Type Affinity по имени NUMERIC, и будет стараться конвертировать значения как в целые числа, так и в числа с плавающей точкой. Если получится, конечно.
9. Становится возможной полная анархия. Создаём поля типа MINTY (целочисленное, поскольку содержит INT), SURREAL (число с плавающей точкой), CHARMED (текстовое), LOLBLOB (внезапно, BLOB) и DINOSAUR (просто числовое, то есть numeric) и заполняем их разными значениями: Image
10. По любым колонкам любых типов можно гонять агрегатные функции. SQLite и глазом не моргну радостно посчитает нам сумму по любым из этих колонок, везде неявно преобразовав типы: Image
11. Первичные ключи в таблицах иногда могут быть NULL. Это официально признанный баг, который не стали фиксить, потому что к моменту обнаружения было слишком много баз данных, зависящих от этого бага. Image
12. Лечится это, например, указанием полного имени типа INTEGER для первичного ключа (а не просто INT), тогда вместо NULL будут вставляться автоинкрементированные значения: Image
13. Есть у SQLite и другие странности. И хоть я в шутку сравнил его с джаваскриптом, это чудесная и очень мощная технология, и пользоваться им можно и нужно (в отличие от джаваскрипта). А если понимать эти особенности, пользоваться будет легче.
14. Почитать больше:
Про странности и особенности — sqlite.org/quirks.html

Про хранение данных и преобразование типов — sqlite.org/datatype3.html

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Vadim Belyaev

Vadim Belyaev Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(