Что случается, когда нет controllable query

yroslavasako

Уязвимость в Bugzilla, позволяющая завести привилегированный аккаунт
В Bugzilla, платформе для ведения базы данных ошибок, контроля за их исправлением и общего координирования процесса разработки, выявлена критическая уязвимость (CVE-2015-4499), дающая возможность завести привилегированный аккаунт, имеющий доступ к закрытой информации, например, к непубличным обсуждениям неисправленных уязвимостей. Эффект от указанной уязвимости напоминает раскрытую несколько недель назад атаку на Bugzilla, в результате которой злоумышленники получили доступ к информации о неисправленных уязвимостях в Firefox в результате перехвата пароля одного из пользователей.
Уязвимость уже устранена в выпусках Bugzilla 5.0.1, 4.4.10 и 4.2.15. Суть проблемы в том, что при сохранении в MySQL логин/email молча обрезается до 255 символов, так как столбец в БД имеет тип tinytext. Таким образом, атакующий может завести аккаунт с адресом "bbbbb...@mozilla.org.site.com", хвост ".site.com" которого будет за пределами 255 байт. Такой аккаунт пройдёт процедуру подтверждения (email с кодом подтверждения будет отправлен на необрезанный адрес), но будет сохранён в БД как "bbbbb...@mozilla.org", что позволит ему просматривать закрытые обсуждения. При заведении аккаунта Bugzilla автоматически добавит подложный аккаунт в группы, соответствующие правилам, заданным через регулярные выражения, например, в bugzilla.mozilla.org добавление в закрытые группы производится при наличии в email домена "mozilla.org".
-------------------------------------------
Шурик, торжествуй!

carusya

Писали в соответствии с RFC821 (на SMTP):
user
The maximum total length of a user name is 64 characters.
domain
The maximum total length of a domain name or number is 64
characters.

То, что емейл может быть не только больше 129, а больше 255 символов, и при этом пролезет через почтовики - ну упс.

Maurog

Суть проблемы
зачет! :grin:

luna89

Так вот зачем пишут тесты на геттеры и сеттеры!

marat7256

Эпик, конечно, но ни БД ни запросы тут не причем. Баг явно чуть раньше доступа к БД.

yroslavasako

Баг в том, что представление в памяти программы не соответствует представлению в базе данных. Каждый из них может заявлять, что проблема на другой стороне, а у него всё в порядке. И вот для этого и нужен controllable query, чтобы несовместимые представления при попытках сочленения выдавали ошибку статической типизации.

marat7256

Можно и так сформулировать, а можно сказать, что не разделены процессы.
Сейчас: регистрация -> запись в базу и посылка почты
Надо: регистрация -> запись в базу -> извлечение из базы и посылка почты
А еще лучше сделать проверку во время ввода на сайте.

yroslavasako

Никто не спорит, что можно написать софт корректно, привести к общему знаменателю, или делать двойную конвертацию туда-обратно, чтобы уравнивать представления. Суть в том, что такой подход может рождать ошибки, как мы видим в данном случае. А статическая типизация не даёт делать таких ошибок вовсе.

Dasar

Надо: регистрация -> запись в базу -> извлечение из базы и посылка почты
А еще лучше сделать проверку во время ввода на сайте.
Необходимость в этом стала известна только постфактум. Только после того как стало известно, что между данными в коде и данными в бд возможно расхождение.

stm5643616

А если на форуме зарегать юзера с емэйла forum.........@hq.sectorb.msk.ru.site.com , то админские права автоматом дадут?

marat7256

Необходимость в проверке очевидна сразу, поскольку "переполнение буфера" (условно в данном случае) одна из самых распространенных ошибок в мире.

Papazyan

А статическая типизация не даёт делать таких ошибок вовсе.
Еще она работать не дает, особенно с базой данных.

Dasar

Еще она работать не дает, особенно с базой данных.
Верно, что "некоторые частные реализации статической типизации не дают работать с БД", но неверен тезис "что всякая статическая типизация не дает работает с БД"

marat7256

Я даже больше скажу. Отсылка к контролабл квери - это просто перенос проблемы из одного слоя в другой. Насколько я помню, самый тривиальный элемент ввода самого обычного HTML позволяет установить ограничение на количество вводимых символов. Но - нет! Надо сначала довести эту проблему аж до БД, а потом искать решение в промежуточном слое между приложением БД, хотя сама проблема тянется от HTML страницы, где это можно решить либо средствами самого HTML, либо средствами javascript!
"Нормальные герои всегда идут в обход".
В обход идти, понятно, не очень-то легко,
не очень-то приятно и очень далеко...

luna89

Проблема в идиотском mysql

stm5872449

где это можно решить либо средствами самого HTML, либо средствами javascript!
Нет, нельзя. man curl.

yroslavasako

А откуда html знает ограничения БД? Что если перейдут на другую БД или на другой компонент html?

luna89

самый тривиальный элемент ввода самого обычного HTML позволяет установить ограничение на количество вводимых символов
Злоумышленник может отправлять http запросы в обход html страниц

marat7256

Ок. Был не прав.

Dasar

Ты исходишь из того, что определение ограничения на максимальную длину почты делается тривиальным образом. Это не так. Поставишь слишком маленькое - потеряешь пользователей, поставишь слишком большое - получишь buffer overflow на каком-либо компоненте.

luna89

Ты исходишь из того, что определение ограничения на максимальную длину почты делается тривиальным образом. Это не так. Поставишь слишком маленькое - потеряешь пользователей, поставишь слишком большое - получишь buffer overflow на каком-либо компоненте.
А зачем ограничение ставить?

yroslavasako

Бобровников предлагал решать проблему именно так. Принять ограничения БД как данность и подстроить программный компонент

Dasar

С одной стороны, мне ограничения не нравятся.
С другой стороны, отсутствие ограничений приводит к DOS-у. Email длиной 2ГБ от одного пользователя положит скорее всего систему целиком.

schipuchka1

Насколько я помню, самый тривиальный элемент ввода самого обычного HTML позволяет установить ограничение на количество вводимых символов.
Я буду матом ругаться. НИКАКАЯ ФИЛЬТРАЦИЯ НА СТОРОНЕ КЛИЕНТА НЕ РАБОТАЕТ НИ ДЛЯ КОГО КРОМЕ ШКОЛЬНИКОВ. И то не всех. Распечатай и повесь на стену.

schipuchka1

Проблема в идиотском mysql
Правда что-ли? Mysql умеет ошибку при переполнении слать, это какой-то умелец strict mode отключил на таблице с емейлами.

luna89

Само наличие такой настройки это глупость.

schipuchka1

Само существование C, где можно выйти за пределы массива, переполнить число и обратиться по произвольному адресу - это глупость ;-). Но работает быстро обычно.

Maurog

Баг в том, что представление в памяти программы не соответствует представлению в базе данных.
это технический баг
а вот использовать пользовательский емейл, чтобы раздавать права - это уже архитектурная дыра

yroslavasako

ну это концепция единого аккаунта. Видимо, строили что-то наподобие домена.

schipuchka1

Т.е. им остальные сайты тоже сломать так можно?

hwh2010

Само существование C, где можно выйти за пределы массива, переполнить число и обратиться по произвольному адресу - это глупость ;-). Но работает быстро обычно.
аналогия неуместна
да массивы в С работают быстрее
а СУБД по производительности пофиг, обрезать ли строку, или выдавать ошибку: что так что так длину проверять придётся
а нестрогий режим наверняка оставили для совместимости с древними версиями mysql, в которых строгого не было

schipuchka1

FAQ считает по-другому:
http://dev.mysql.com/doc/refman/5.0/en/faqs-sql-modes.html#...
A.3.6: Does strict mode impact performance?
The intensive validation of input data that some settings requires more time than if the validation is not done. While the performance impact is not that great, if you do not require such validation (perhaps your application already handles all of this), then MySQL gives you the option of leaving strict mode disabled. However—if you do require it—strict mode can provide such validation.

6yrop

А статическая типизация не даёт делать таких ошибок вовсе.

Еще она работать не дает, особенно с базой данных.
Основной язык для работы с базами данных SQL.
SQL является статически типизированным языком, внезапно.

Papazyan

SQL является статически типизированным языком, внезапно.
С чего вдруг. Даже базу можно удалить, а потом создать новую с произвольными колонками.

marat7256

А ты не смешивай DDL и DML.

6yrop

С чего вдруг.
http://en.wikipedia.org/wiki/SQL
Typing discipline Static, strong
Даже базу можно удалить, а потом создать новую с произвольными колонками.

На C# тоже можно в рантайме создать типы с произвольными колонками и их экземпляры.

Papazyan

Ты всему, что на заборе написано веришь?
Стандарт не содержит требования статической проверки типов, да это и не возможно из-за того, что нет необходимости их явно объявлять, есть каст, есть нулл. Более того, в стандарте явно описываются дескрипторы типов, которые есть явный признак динамического языка.

Papazyan

Ну и вообще, спор о самом SQL бессмысленнен, потому что никакой строгой типизации в реальных базах данных нет. Поменяешь таблицу - могут потом упасть и процедуры базы и клиенты со старыми кверями.

6yrop

Стандарт не содержит требования статической проверки типов, да это и не возможно из-за того, что нет необходимости их явно объявлять
Если колонку не объявить, SQL запрос не пройдет статическую проверку.
есть каст,

Каксты есть в статических языках. К чему ты это написал?
Более того, в стандарте явно описываются дескрипторы типов, которые есть явный признак динамического языка.

В C# есть dynamic, есть рефлекшен, и что? В языках смешиваются статическая и динамическая типизация, это давно не новость. Тем не менее, базовая часть SQL статически типизированная. Надежно работают find usages и рефакторинг.

6yrop

Ну и вообще, спор о самом SQL бессмысленнен, потому что никакой строгой типизации в реальных базах данных нет. Поменяешь таблицу - могут потом упасть и процедуры базы и клиенты со старыми кверями.
В SQL Server есть dm_sql_referenced_entities. Можно посмотреть в каких процедурах используется эта таблица. Меняешь таблицу, меняешь эти процедуры.
Есть SQL Server Data Tools, в котором есть авторефакторинг. Есть несколько сторонних продуктов для авторефакторинга.
... и клиенты со старыми кверями.
На клиентах кто-то использует LINQ, кто-то Controllable Query.

Dasar

Поменяешь таблицу - могут потом упасть и процедуры базы и клиенты со старыми кверями.
В .net-е если поменяешь одну assembly, то упадет всё остальное. В C/C++ если объявления будут разными в разных единицах трансляции, то всё соберется, но работать не будет.
Эти примеры показывают, что статическая типизация работает внутри отдельных контекстов - единиц трансляции. В Sql-е единицы трансляции очень маленькие: запрос, stored procedure, таблица.

6yrop

В Sql-е единицы трансляции очень маленькие: запрос, stored procedure, таблица.
dm_sql_referenced_entities работает по всей базе.

Dasar

Это не отменяет моего мнения, что Sql стоит сжечь в аду. Sql родом из 70-ых и там же остался по своему удобству.

6yrop

Sql родом из 70-ых и там же остался по своему удобству.
Открой для себя продукты dbforge, SQL становится удобным.
P.S. И проверенный временем.

luna89

Кстати, многие не понимают что разработка под базу данных больше всего похожа на repl статического языка, например на ghci. Запросы, конечно, надо заворачивать во вьюхи, тогда статическая типизация отлично работает.
Ну и то что для интроспекции объектов в SQL используется сам SQL, это прикольно. Можно например рекурсивным SQL запросом вывести список вьюх, которые транзитивно зависят от какой-то вьюхи.
В принципе, следовало бы ко всяким решарперам приделать язык запросов.

Dasar

В принципе, следовало бы ко всяким решарперам приделать язык запросов.
Roslyn

luna89

Это не отменяет моего мнения, что Sql стоит сжечь в аду. Sql родом из 70-ых и там же остался по своему удобству.
SQL - это логическое программирование. Все прикладное программирование должно быть логическим. Сейчас для прикладного программирования используют низкоуровневые языки, такие как, например, javascript и C#. Эти языки используют такие низкоуровненые понятия, как, например, указатели (ссылки), массивы, хэш-таблицы. Кроме того, в них есть контекст выполнения, и связанные с ним ужасы, такие как пошаговый отладчик.
В 70-е годы понимали, что высокоуровневое программирование надо очистить от этого ассемблерного говна, поэтому изобрели SQL. К сожалению, сейчас крупные компании, которые должны заниматься разработкой средств разработки для прикладного программирования, находятся в состоянии полной импотенции, кроме, отчасти, фейсбука.
Так что на данный момент выбор такой - либо использовать высокоуровневый SQL родом из 70-x, либо использовать низкоуровневые ассемблеры из 90-x - 2000-x

Dasar

Эти языки используют такие низкоуровненые понятия, как, например, указатели (ссылки), массивы, хэш-таблицы.
Чем указатель отличается от курсора? Чем массив отличается от таблицы в БД? Чем хэш-таблица в коде отличается от хэш-таблицы в БД?
Инструменты работы с данными и там, и там одинаковые.
Основное отличие sql-я от универсальных языков в том, что sql из коробки поддерживает преобразование выражения из формы удобной для записи в форму оптимальную для выполнения.
ps
Классически, Sql.Dml относят к декларативным языкам, а к не логическим. Логические - это пролог. В них есть из коробки - выведение новых утверждений на основе исходных.
http://en.wikipedia.org/wiki/Data_manipulation_language

agaaaa

полной импотенции, кроме, отчасти, фейсбука
Это ты про пхп на костылях или про реакт, от которого фанатеют фронтендщики, до того ни разу не видевшие приличного mvvm фреймворка вроде WPF?

6yrop

приличного mvvm фреймворка вроде WPF?
Запости полный код для сложения двух чисел, а мы поржем. :grin: Два текстовых поля, если в поля введены два целых числа, то рядом вывести их сумм.

Papazyan

Основное отличие sql-я от универсальных языков в том, что sql из коробки поддерживает преобразование выражения из формы удобной для записи в форму оптимальную для выполнения.
Главное отличие sql - это представление данных в альтернативной форме, не так как в обычных языках. Оптимальное выполнение - это уже ересь, можно выполнение и в явно задавать порядком выражений.

6yrop

Читаем классику 80 годов:
22.2 WHAT MAKES A DATABASE COMPUTATION MODEL
POWERFUL?
I claim that the power of relational algebra as an abstraction of disk storage
comes from its encapsulation of iteration. Seven or eight common forms of
iteration over sets of records are itified, and queries are expressed in terms
of them. Since there are a small number of forms, their interactions can be
studied in detail, giving rise to transformations that can be used for optimizing
queries. Effort can be directed at efficient implementation of this handful
of iteration forms. Since the iteration is expressed at a high level, multiple
orderings for accessing records are permissible, and the physical ordering or
records and foreknowledge of access patterns can be used to great advantage.
Further, use of auxiliary access structures can be embedded in the evaluation
methods for the algebraic operators, making applications indepent of the
presence or absence of such structures, and simplifying that code. A query
processor can delay choosing a particular evaluation plan for an algebraic
expression until the sizes of the arguments are known, allowing even more
efficiencies in execution. None of these advantages is available when database
manipulations are expressed with explicit looping structures. Looping gives a
particular implementation of the query, from which it is nearly impossible to
infer the intent. Thus, the range of transformations and evaluation choices is
severely limited. Moreover, the record-at-a-time nature of explicit iterations
places high demands on the communication bandwidth between application
programs and the database system.
I expect the next generation of database systems to reside on a network
of workstations, with a central or distributed storage manager, shared by
application programs over the network. Here, the importance of being able
to express iterations and other data-intensive operations succinctly is even
greater. Whatever the database programming model, it must allow complex,
data-intensive operations to be picked out of programs for execution by the
storage manager, rather than forcing a record or object-at-a-time interface.

Dasar

Что такое "представление данных в альтернативной форме"?

Papazyan

Читаем классику 80 годов:
Давай еще 60-е вспомним. Да, было преимущество когда-то, а сейчас его нет.

Papazyan

Looping gives a
particular implementation of the query, from which it is nearly impossible to
infer the intent.
Вот только есть одна проблема, конкретная имплементация человеком обычно одна из лучших возможных, а вот что там навыводит автоматический скедулер это еще вопрос. На практике, вокруг базы ходят с шаманским бубном и без спеца не обойдешься.
И в общем-то достаточно вспомнить, что в sql нет явного порядка записей, что на корню убивает перформанс любых задач с порядком.

Papazyan

Что такое "представление данных в альтернативной форме"?
Например ООП учит думать в терминах объектов - инкапсуляция, то-се. Функциональное программирование учит решать задачи не полагаясь на состояние (недавно писал в ООП так меня колбасило от императивщины). SQL - это еще один подход к организации данных.

Dasar

SQL - это еще один подход к организации данных.
В чем суть такой организации данных?
Есть ли что-то еще кроме альтернативной организации данных? Или другими словами, если в универсальном языке реализовать такую же организацию данных как в реляционной БД, то получится ли Sql-подход?

6yrop

...человеком обычно одна из лучших возможных ...
Напиши название системы управления данными, про которую ты написал эту фразу.
И в общем-то достаточно вспомнить, что в sql нет явного порядка записей, что на корню убивает перформанс любых задач с порядком.
Бред какой-то. В том же хештейбле нет порядка как раз по причине перфоманса.
На практике, вокруг базы ходят с шаманским бубном и без спеца не обойдешься.

Это Oracle специально разводит "спецов" вокруг базы. У этой компании такая маркетинговая стратегия. Такие законы рынка.
С SQL Server могут самостоятельно работать full-stack программисты.

6yrop

Давай еще 60-е вспомним. Да, было преимущество когда-то, а сейчас его нет.
А что изменилось, что нового появилось? Называй уже о каких системах управления данными ты говоришь.

yroslavasako

PHP появился

Papazyan

Бред какой-то. В том же хештейбле нет порядка как раз по причине перфоманса.
Бред у тебя в штанах. А реальные данные обычно организованы или по времени или пространственно и с sql с ними работать сложно. Достаточно почитать книгу, где извращенцы реализуют на sql списки, деревья и т.п.

Papazyan

Есть ли что-то еще кроме альтернативной организации данных? Или другими словами, если в универсальном языке реализовать такую же организацию данных как в реляционной БД, то получится ли Sql-подход?
Основные операции над данными также отличаются. Они близки к векторным, которые заметно другие по сравнению с императивной модификацией значений или функциональными преобразованиями.

Dasar

> Они близки к векторным, которые заметно другие по сравнению с императивной модификацией значений или функциональными преобразованиями.
Если такие векторные(групповые) операции реализовать в коде, то достаточно ли этого будет для построения sql-подхода на основе универсального ЯП?

Papazyan

да

6yrop

А реальные данные обычно организованы или по времени или пространственно и с sql с ними работать сложно. Достаточно почитать книгу, где извращенцы реализуют на sql списки, деревья и т.п.
Реальные данные в большинстве компаний находятся под управлением RDBMS.

6yrop

Достаточно почитать книгу, где извращенцы реализуют на sql списки, деревья и т.п.
А так, да, извращенцев много, даже key-value хранилище нередко делают на RDBMS. Тот же Майк впарил Связному такую систему.

Dasar

Как быть с тем, что в Sql-е есть возможность добавить индекс и ускорить выполнения кода без переписывания кода? а в ЯП такого из коробки нет?

Papazyan

Как быть с тем, что в Sql-е есть возможность добавить индекс и ускорить выполнения кода без переписывания кода? а в ЯП такого из коробки нет?
Во-первых, есть языки, где есть такая возможность. Во-вторых, в ЯП можно использовать не только индекс, но и сортировку и предварительное группирование и другие методы ускорения доступа.

Dasar

Во-первых, есть языки, где есть такая возможность.
Например?

6yrop

Например?
Типичный слив в разделе девелопмент: "это можно делать лучше, но я не покажу как".

Filan

Это Oracle специально разводит "спецов" вокруг базы. У этой компании такая маркетинговая стратегия. Такие законы рынка.
С SQL Server могут самостоятельно работать full-stack программисты.
DBA с разработчиками случаем не путаешь?
На вскидку даже вспомнить не могу ни одной РСУБД, для разработки на которой требуются такого уровня специалисты.
А вот для грамотного администрирования поголовно, и MSSQL тут не исключение.
P.S. Если чё я в теме: у меня сертификат DBA по DB2 9.7 и сдан экзамен по Oracle 11g «SQL Fundamentals» (только не спрашивайте зачем :-D).

6yrop

Что делает DBA?
Для администрирования MSSQL достаточно общего системного администратора (бекапы настроить и т.п.). Остальное делают full-stack разработчики.

marat7256

Что делает DBA?
Да, это дармоеды, просто! Они только тем и занимаются, что мешают разрабам - вечно базу замедляют, вечно что-то переконфигурируют - один вред от них.

6yrop

У full-stack разработчика больше знаний о предметной области, о технических деталях системы и больше средств для повышения быстродействия базы.

Alena_08_11

Если только у сферического в вакууме full stack разработчика

Filan

Так и напрашивается: «Тыжпрограммист!».

marat7256

Как на счет организации размещения datafiles, организации tablespaceов, организации redologs и прочих shared poolов, настройки которых могут радикально влиять на производительность?
Разумеется, все эти настройки зависят от того, что будет крутиться в базе. Однако, разработчик в 90% случаев о деталях может вообще не догадываться.

6yrop

Как на счет организации размещения datafiles, организации tablespaceов, организации redologs и прочих shared poolов, настройки которых могут радикально влиять на производительность?Разумеется, все эти настройки зависят от того, что будет крутиться в базе. Однако, разработчик в 90% случаев о деталях может вообще не догадываться.
Хороший разработчик должен знать, что может радикально влиять на производительность, если он этого не знает, то стоит узнать. :)
А так да, бывает, в этом разделе один известный персонаж писал, что обращение к базе это 300ms.

Filan

Хороший разработчик должен знать, что может радикально влиять на производительность, если он этого не знает, то стоит узнать. :)
В моей вселенной программисты зачастую даже среду разработки не в состоянии сами себе установить и настроить, а ты говоришь о тонкой настройке СУБД.
Даже если разработчики толковые, всё равно в большой команде обязательно есть кто-то с компетенцией DBA. И только в маленьких проектах не привлекают DBA, а полагаются на собственные знания разработчиков.

yroslavasako

Абстракции текут. Абстракции БД - тоже. На весь проект нужен хотя бы один разработчик, который разбирается во всех слоях и может заткнуть утечки.

marat7256

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

6yrop

Такое заклинание можно к чему угодно применять не ограничивая себя в фантазии. ... выяснять вещи напрямую его не касающиеся, которые должен выполнять специалист другой квалификации.
Твоё высказывание самоприменимо. :)
На практике же разработчик просто отвлекается от разработки, когда начинает
Бобровников о "практике" разработчика. :grin:

marat7256

Бобровников о "практике" разработчика.
Крайний аргумент использован - box checked!

Filan

На весь проект нужен хотя бы один разработчик, который разбирается во всех слоях

Архитектор, ГИП, технический лидер, но это всё не то - они все всё равно всё не знают (надо больше слов все/всё в одном предложении!).
и может заткнуть утечки.

Обычно это всё же разные люди, а не один. А этот один разве что знает к кому обратиться по тому или иному вопросу.
P.S. Во многих проектах именно таким человеком и являюсь, и меня часто привлекают к другим проектам в качестве консультанта по таким вопросам - далеко не всегда получается обойтись без специалистов в специфических областях.

yroslavasako

если это разные люди, то спланировать проект будет им очень сложно.

marat7256

Только в том случае, когда они друг другу не доверяют или сомневаются в компетенции.

6yrop

Только в том случае, когда они друг другу не доверяют или сомневаются в компетенции.
Когда не все в доле?

hwh2010

Что делает DBA?
Для администрирования MSSQL достаточно общего системного администратора (бекапы настроить и т.п.). Остальное делают full-stack разработчики.
я уж не знаю как у вас в MSSQL, может быть там рай на земле
между прочим существует промежуточная между DBA и full-stack developer профессия: разработчик баз данных

6yrop

я уж не знаю как у вас в MSSQL, может быть там рай на земле
между прочим существует промежуточная между DBA и full-stack developer профессия: разработчик баз данных
Чем больше работаю с Oracle, тем больше, да, чувствую себя изгнанным из рая.
разработчик баз данных

А кто это? Не те ли это извращенцы, которые реализуют бизнес логику в хранимых процедурах в 2015 году?

bleyman

Баг в том, что представление в памяти программы не соответствует представлению в базе данных. Каждый из них может заявлять, что проблема на другой стороне, а у него всё в порядке. И вот для этого и нужен controllable query, чтобы несовместимые представления при попытках сочленения выдавали ошибку статической типизации.
Нет. Баг в том, что MySQL молча обрезает значения, записываемые в базу.
Ты можешь хоть усраться со своей статической типизацией или наоборот с динамическими проверками, если твоя база данных тебе может иногда в чём-то врать, то как ты её не обкладывай проверками, всегда есть вероятность того, что она тебе наврёт так, что ты этого не заметишь.
Солюшен: не использовать базы данных которые врут. Используйте настоящие базы данных, например совершенно бесплатную и опенсорсную PostgreSQL.

yroslavasako

И часто ты проверяешь целостность, скажем, Map коллекции в своём языке программирования?

hwh2010

Чем больше работаю с Oracle, тем больше, да, чувствую себя изгнанным из рая.
угу, оракл пропитан неуважением к разработчику
А кто это? Не те ли это извращенцы, которые реализуют бизнес логику в хранимых процедурах в 2015 году?
по-разному бывает
как минимум, эти извращенцы проектируют структуру БД и оптимизируют медленные запросы, написанные фулл-стеками, в том числе заносчивыми и самоуверенными
зачастую также эти подлецы действительно реализуют нетривиальную работу с данными на хранимых процедурах и почему-то при этом не гоняют данные на клиент и обратно между запросами
наверное потому что для работы с БД они используют плохую библиотеку, не иначе

YUAL

Баг в том, что MySQL молча обрезает значения, записываемые в базу.
Ну как минимум это ложь. По-умолчанию он выдаёт ворнинг. Его можно либо обработать на стороне приложения (я когда недавно писал скриптик для миграции где как раз были проблемы со слишком дллинными полями сделал именно так) либо переключить мускуль в режим когда он выдаёт ошибку вместо ворнинга:
 

mysql> desc tokens
-> ;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| user_id | int(11) | YES | MUL | NULL | |
| token | varchar(32) | NO | PRI | NULL | |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into tokens (user_id, token) VALUE (2, 'sdfsdfsdfdsjhfkjsdhfkjdshf');
Query OK, 1 row affected (0.01 sec)
mysql> insert into tokens (user_id, token) VALUE (2, 'sdfsdfsdfdsjhfkjsdhfkjdshffdjghfdkjghfdjhgfjdhgjdfhgjdfhgjdfkhgdjkfhgfjdkhgfkdjhg');
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> SET @@sql_mode:=TRADITIONAL;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tokens (user_id, token) VALUE (2, 'sdgddfsdfsdfdsjhfkjsdhfkjdshffdjghfdkjghfdjhgfjdhgjdfhgjdfhgjdfkhgdjkfhgfjdkhgfkdjhsg')\G
ERROR 1406 (22001): Data too long for column 'token' at row 1


Такое поведение базы. Вот тут недавно шурик распинался про фулл-стак разработчиков. Эти фулл-стак разработчики должны знать как правильно работать с базой. А если пользоваться ORM то он берёт это на себя. Например в джанге таких проблем нет - он проверит перед инсёртом в базу.

luna89

И в общем-то достаточно вспомнить, что в sql нет явного порядка записей, что на корню убивает перформанс любых задач с порядком.
SQL абстрагирует логику от низкоуровневых структур данных. Ты создаешь обычные таблицы, выражаешь логику SQL-запросами, а потом прозрачно (не меняя кода запросов) тюнишь опции хранения таблиц. Например, если надо быстро выбирать данные по порядку, в оракле можно сказать чтобы у тебя таблица была организована как дерево.
о-вторых, в ЯП можно использовать не только индекс, но и сортировку и предварительное группирование

В номальных системах программирования предварительная группировка делается прозрачно и декларативно
конкретная имплементация человеком обычно одна из лучших возможных, а вот что там навыводит автоматический скедулер это еще вопрос

Раньше программисты на ассемблере так говорили про C.

ppplva

Раньше программисты на ассемблере так говорили про C.
И это до сих пор верно - при небольшом объеме кода.
Типичный объем SQL кода растет совсем не так быстро.

6yrop

Типичный объем SQL кода растет совсем не так быстро.
что такое типичный объем кода SQL?
на js тоже типичный объем кода не растет быстро, как думаешь почему?

luna89

на js тоже типичный объем кода не растет быстро
Думаю, статистика npm противоречит этому утверждению

6yrop

Думаю, статистика npm противоречит этому утверждению
Это статистика детских песочниц.
До сих пор LOB приложения пишут на WinForms и WPF. При всех убожествах этих технологий. Просто с js на таких проектах будет еще хуже. Есть робкие шаги в виде TypeScript. Но TS уже несколько лет, .NET в начале 2000-х за такое количество лет уже вовсю рулил в эентерпрайзе.
Оставить комментарий
Имя или ник:
Комментарий: