12

有关更新数据库的 ColdFusion 10 文档有一节介绍ColdFusion 10 中与数据库相关的增强功能。该页面提到现在有支持CF_SQL_NVARCHAR,但没有关于它们的详细信息。此外,cfqueryparam 文档尚未更新以包含它们的存在。

cfqueryparam的ColdFusion 9 文档提到CF_SQL_VARCHAR映射到varcharMSSQL。这是真的,除非 ColdFusion 管理员数据源设置String Format启用了该设置。在这种情况下CF_SQL_VARCHAR映射到nvarchar. 这个记录不充分的功能是一种 hack,它可能会导致ColdFusion出现性能问题。

所以他们介绍了 很棒CF_SQL_NVARCHAR,但最好了解它是如何工作的。它只是CF_SQL_VARCHAR让它变得毫无意义的别名?它总是发送字符串nvarchar吗?如果是这样,是否CF_SQL_VARCHAR总是发送varchar

我希望为了向后兼容,它是这样实现的:

如果String Format启用CF_SQL_VARCHAR并且CF_SQL_NVARCHAR两者都映射到nvarchar.

如果String Format禁用则CF_SQL_VARCHAR映射到varcharCF_SQL_NVARCHAR映射到nvarchar

这意味着任何 CF10 之前的站点都可以迁移到 CF10 并工作,具有与 CF10 之前相同的性能考虑。

新站点或重写所有查询以匹配CF_SQL_VARCHARCF_SQL_NVARCHAR与数据库设计相匹配的站点将不会受到 CF10 之前不可避免的性能损失。

任何人都可以确认是否是这种情况;如果有官方的东西更好?

4

1 回答 1

12

当你在等待更正式的东西时,我会投入我的 0.02 美元......

我做了一些挖掘,根据我的观察(使用 MS SQL 数据源),我相信:

  • CF_SQL_NVARCHAR不仅仅是CF_SQL_VARCHAR. 它映射到较新的NVARCHAR jdbc 类型,它允许您在更精细的级别处理 unicode 值。

  • CF_SQL_NVARCHAR值始终被视为nvarchar

  • 的处理CF_SQL_VARCHAR取决于String Format设置,与以前的版本相同。

CF_SQL_NVARCHAR 测试/结果:

如果启用数据源日志记录,您可以看到驱动程序在使用setNString时调用特殊方法CF_SQL_NVARCHAR。所以最终值被发送到数据库作为nvarchar. (您可以使用 SQL Profiler 确认这一点)

    // Query
    SELECT  ID
    FROM    Test
    WHERE   NVarcharColumn = <cfqueryparam value="#form.value#" cfsqltype="cf_sql_nvarchar">

    // Log 
    spy(...)>> PreparedStatement[9].setNString(int parameterIndex, String value)

    // Profiler
    exec sp_prepexec @p1 output,N'@P1 nvarchar(4000)',N'SELECT  ID
            FROM    Test
            WHERE   NVarcharColumn = @P1 ',N'Стоял он, дум великих полн'

CF_SQL_VARCHAR 测试/结果:

在 的情况下CF_SQL_VARCHAR,它在技术上被标记为varchar。但是,该String Format设置最终控制了数据库如何处理它。当设置启用时,它被处理为nvarchar。当它被禁用时,它被视为varchar. 同样,您可以使用 SQL Profiler 验证这一点。

最重要的是,到目前为止,我所看到的一切都表明您对实施的目标是正确的。

    // Query
    SELECT  ID
    FROM    Test
    WHERE   PlainVarcharColumn = <cfqueryparam value="#form.value#" cfsqltype="cf_sql_varchar">

    // Log
    spy(..)>> PreparedStatement[8].setObject(int parameterIndex, Object x, int targetSqlType)
    spy(..)>> parameterIndex = 1
    spy(..)>> x = ????? ??, ??? ??????? ????
    spy(..)>> targetSqlType = 12  (ie CF_SQL_VARCHAR)

    // Profiler (Setting ENABLED)
    exec sp_prepexec @p1 output,N'@P1 nvarchar(4000)',N'SELECT  ID
            FROM    Test
            WHERE   PlainVarcharColumn = @P1 ',N'Стоял он, дум великих полн'

    // Profiler (Setting DIS-abled)
    exec sp_prepexec @p1 output,N'@P1 varchar(8000)',N'SELECT  ID
            FROM    Test
            WHERE   PlainVarcharColumn = @P1 ','????? ??, ??? ??????? ????'
于 2012-06-01T09:56:03.430 回答