Распространено ли привязывать значения по умолчанию в операторах CREATE TABLE? - PullRequest
0 голосов
/ 05 июня 2018

Должен ли я исполняться напрямую (псевдокод) ...

q = "CREATE TABLE `usermood` { `id` INT, `name` TEXT, `mood` VARCHAR DEFAULT 'gloomy' }";
exec(q);

... или связываться с (не) именованным заполнителем?

q = "CREATE TABLE `usermood` { `id` INT, `name` TEXT, `mood` VARCHAR DEFAULT :mood }";
prepare(q);
bind(q, ":mood", 'gloomy');
exec(q);

Я никогда не виделэто в любом примере кода.

Речь идет не столько о безопасности экранирования (потому что я контролирую операторы создания), сколько о преобразовании значения в формат, совместимый с базой данных (автоматический выбор представления контента по типу).

Я использую MySQL, а также SQLite3.

Существуют ли драйверы баз данных, которые не поддерживают привязку в операторах создания?

Если кому-то интересно: я использую QSqlQuery с QVariant в качестве значения.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

SQLite явно запрещает привязку значений по умолчанию:

из документов SQLite:

Явное предложение DEFAULT может указывать, что значением по умолчанию является NULL, aстроковая константа, константа BLOB-объекта, число со знаком, или любое константное выражение , заключенное в скобки.Значением по умолчанию также может быть одно из специальных не зависящих от регистра ключевых слов CURRENT_TIME, CURRENT_DATE или CURRENT_TIMESTAMP.Для целей предложения DEFAULT выражение считается константой, если оно не содержит подзапросов, ссылок на столбцы или таблицы, связанных параметров или строковых литералов, заключенных в двойные кавычкивместо одинарных кавычек.

(выделено мной)

0 голосов
/ 05 июня 2018

Привязка параметров будет использоваться, когда:

  • Вы используете значение из неизвестного источника и хотите защитить от внедрения SQL.

  • Вы хотите подготовить оператор и выполнить его многократно, используя разные значения для параметра.

Ни один из них не подходит для вашего CREATE TABLEпример.

Я никогда не использовал параметр ни в одном операторе DDL.

PS: Вы не можете установить DEFAULT для столбца TEXT независимо от того, является ли он связанным параметром или литеральным значением воператор DDL, но я предполагаю, что ваш пример выше является искусственным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...