在 ColdFusion 10 中使用 CF_SQL_NVARCHAR 的详细信息是什么?

2024-01-12

有关更新数据库的 ColdFusion 10 文档有一节介绍ColdFusion 10 中与数据库相关的增强功能 http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSc3ff6d0ea77859461172e0811cbec0e02b-7ff3.html#WSe61e35da8d318518-9efe7cf1358680a71d-8000。该页面提到现在支持CF_SQL_NVARCHAR等,但没有透露具体细节。此外,cfqueryparam 文档 http://help.adobe.com/en_US/ColdFusion/10.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f6f.html尚未更新以包含它们的存在。

The cfqueryparam 的 ColdFusion 9 文档 http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f6f.html提到CF_SQL_VARCHAR映射到varchar在MSSQL中。这是真的,除非 ColdFusion 管理员数据源设置 http://help.adobe.com/en_US/ColdFusion/9.0/Admin/WSc3ff6d0ea77859461172e0811cbf364104-7fe5.htmlString Format设置已启用。在这种情况下CF_SQL_VARCHAR映射到nvarchar。这个记录不足的功能是一种黑客行为,可以导致性能问题 https://stackoverflow.com/questions/10543755/slow-query-with-cfqueryparam-searching-on-indexed-column-containing-hashes在 ColdFusion 中。

所以很高兴他们推出了CF_SQL_NVARCHAR,但最好了解它是如何工作的。它只是一个别名CF_SQL_VARCHAR让它变得毫无意义?它总是将字符串发送为nvarchar?如果是的话,是否CF_SQL_VARCHAR总是发送varchar?

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

If String Format已启用CF_SQL_VARCHAR and CF_SQL_NVARCHAR两者都映射到nvarchar.

If String Format然后被禁用CF_SQL_VARCHAR映射到varchar and CF_SQL_NVARCHAR映射到nvarchar.

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

新站点或重写所有查询以匹配的站点CF_SQL_VARCHAR and CF_SQL_NVARCHAR使用数据库设计不会受到 CF10 之前不可避免的性能损失。

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


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

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

  • CF_SQL_NVARCHAR不仅仅是一个别名CF_SQL_VARCHAR。它映射到较新的NVARCHAR jdbc 类型 http://docs.oracle.com/javase/6/docs/api/java/sql/Types.html#NVARCHAR,它使您可以更精细地处理 unicode 值。

  • CF_SQL_NVARCHAR值始终被视为nvarchar

  • 的处理CF_SQL_VARCHAR取决于String Format http://technet.microsoft.com/en-US/library/ms378857%28v=SQL.90%29.aspx设置,与之前版本相同。

CF_SQL_NVARCHAR 测试/结果:

如果启用数据源日志记录,您可以看到驱动程序调用特殊的setNString http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setNString%28int,%20java.lang.String%29每当方法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 ','????? ??, ??? ??????? ????'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ColdFusion 10 中使用 CF_SQL_NVARCHAR 的详细信息是什么? 的相关文章

随机推荐