代码之家  ›  专栏  ›  技术社区  ›  MosheElisha

为什么PreparedStatement.setNull需要sqlType?

  •  16
  • MosheElisha  · 技术社区  · 14 年前
    1. 根据PreparedStatement.setNull的java文档:“注意:必须指定参数的SQL类型”。该方法需要列的SQL类型的原因是什么?

    2. 我注意到传递java.sql.Types.VARCHAR也适用于非VARCHAR列。是否存在VARCHAR不适合的情况(某些列类型或某些DB提供程序)?

    谢谢。

    3 回复  |  直到 14 年前
        1
  •  11
  •   Sanjay T. Sharma    14 年前

    根据java文档 PreparedStatement.setNull:“注意:您 必须指定参数的SQL 类型”。是什么原因 方法需要 专栏?

    对于最大兼容性,根据规范,有些数据库不允许未类型化的null发送到基础数据源。

    我注意到路过 java.sql.Types.VARCHAR也适用于 非varchar列。有 VARCHAR不会 适用(某些柱类型或 某些数据库提供商)?

        2
  •  8
  •   thokuest    8 年前

    JDBC驱动程序似乎正在从 setNull . 见 Add support for setObject(<arg>, null) .

    我的数据库列表支持更符合逻辑的行为:

    1. 甲骨文公司
    2. MySQL数据库
    3. 赛贝斯
    4. MS SQL服务器
    5. HSQL语言

    不支持此逻辑行为的数据库列表是:

    1. 德比 Queries with guarded null Parameter fail
    2. PostgreSQL公司 Cannot pass null in Parameter in Query for ISNULL Suggested solution
        3
  •  1
  •   Lasse Jenssen    12 年前

    对于Oracle,对其他数据类型使用varchar2是非常不明智的。这可能会愚弄优化器,而您可能会得到一个糟糕的执行计划。例如,在绑定中使用时间戳数据类型对日期列进行筛选,Oracle可能最终读取所有将所有日期转换为时间戳的行,然后筛选出所需的行。 如果在date列上有一个索引,它甚至可能变得更糟(如果oracle选择使用它的话)——对oracle块执行单次读取。

    --拉丝