代码之家  ›  专栏  ›  技术社区  ›  Martin Hennings

在“CREATE TABLE”语句中绑定默认值是否常见?

  •  1
  • Martin Hennings  · 技术社区  · 6 年前

    我应该直接执行(伪代码)。。。

    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);
    

    我从未在任何示例代码中见过它。

    这不是关于转义的安全性(因为我控制create语句),而是关于将值转换为与数据库兼容的格式(按类型自动选择内容表示)。

    我在使用MySQL和SQLite3。

    是否有数据库驱动程序不支持create语句中的绑定?

    如果有人感兴趣:我正在使用 QSqlQuery 具有 QVariant 作为价值。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Bill Karwin    6 年前

    在以下情况下,可以使用参数绑定:

    • 您正在使用来自未知源的值,并且希望防止SQL注入。

    • 您需要准备一条语句,并使用不同的参数值重复执行它。

    这两种方法都不适用于CREATE TABLE示例。

    我从未在任何DDL语句中使用过参数。

    注意:无论文本列是绑定参数还是DDL语句中的文本值,都不能为其设置默认值,但我猜上面的示例是人为的。

        2
  •  0
  •   Martin Hennings    6 年前

    SQLite明确禁止绑定默认值:

    from the SQLite docs:

    显式DEFAULT子句可以指定默认值为NULL、字符串常量、blob常量、带符号数字、, 或者任何常量表达式 用括号括起来。默认值也可以是与特殊情况无关的关键字CURRENT_TIME、CURRENT_DATE或CURRENT_TIMESTAMP之一。就违约条款而言, 如果表达式不包含任何值,则认为它是常量 子查询、列或表引用, 约束参数 ,或用双引号而不是单引号括起来的字符串文字。

    (我强调)