【问题标题】:What are the details for using CF_SQL_NVARCHAR in ColdFusion 10?在 ColdFusion 10 中使用 CF_SQL_NVARCHAR 的细节是什么?
【发布时间】:2012-05-29 15:42:51
【问题描述】:

有关更新数据库的 ColdFusion 10 文档中有一个关于 Database-related enhancements in ColdFusion 10 的部分。该页面提到现在支持CF_SQL_NVARCHAR 等,但没有关于它们的详细信息。此外,cfqueryparam documentation 尚未更新以包含它们的存在。

ColdFusion 9 documentation for cfqueryparam 提到 CF_SQL_VARCHAR 映射到 MSSQL 中的 varchar。这是真的,除非 ColdFusion 管理员 datasource settings 启用了 String Format 设置。在这种情况下,CF_SQL_VARCHAR 映射到 nvarchar。这个记录不充分的功能是一个可以在 ColdFusion 中 cause performance issues 的 hack。

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

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

如果 String Format 启用,CF_SQL_VARCHARCF_SQL_NVARCHAR 都映射到 nvarchar

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

这意味着任何 CF10 之前的网站都可以迁移到 CF10 并正常工作,并且具有与 CF10 之前相同的性能注意事项。

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

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

【问题讨论】:

    标签: coldfusion coldfusion-10


    【解决方案1】:

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

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

    • CF_SQL_NVARCHAR 不仅仅是CF_SQL_VARCHAR 的别名。它映射到较新的 NVARCHAR jdbc type,让您可以更精细地处理 unicode 值。

    • CF_SQL_NVARCHAR 值始终被视为nvarchar

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

    CF_SQL_NVARCHAR 测试/结果:

    如果您启用数据源日志记录,您可以看到驱动程序在使用 CF_SQL_NVARCHAR 时调用特殊的 setNString 方法。所以最终该值作为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 ','????? ??, ??? ??????? ????'
    

    【讨论】:

    • "设置启用时,作为varchar处理。禁用时,作为nvarchar处理。"我想你的意思正好相反?
    • 是的。感谢您指出。当我看到你的评论时,我正在修复它。
    • @Leigh,如何在驱动程序上启用数据源日志记录?
    猜你喜欢
    • 2017-07-30
    • 2022-01-10
    • 2016-08-30
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多