微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

ColdFusion 9 documentation for cfqueryparam提到CF_sql_VARCHAR映射到MSsql中的varchar.这是真的,除非ColdFusion Administrator datasource settings启用了字符串格式设置.在这种情况下,CF_sql_VARCHAR映射到nvarchar.这个记录不良的功能是可以在ColdFusion中的cause performance issues的黑客攻击.

所以很好,他们介绍了CF_sql_NVARCHAR,但很好理解它是如何工作的.它只是一个CF_sql_VARCHAR的别名,使它毫无意义?它总是发送字符串为nvarchar吗?如果是这样,CF_sql_VARCHAR是否始终在varchar中发送?

我希望为了实现向下兼容,这样实现:

如果启用了字符串格式CF_sql_VARCHAR和CF_sql_NVARCHAR都映射到nvarchar.

如果字符串格式被禁用,CF_sql_VARCHAR映射到varchar和CF_sql_NVARCHAR映射到nvarchar.

这意味着CF10之前的任何CF10现场可以移动到CF10,并且在CF10之前具有相同的性能考虑.

建站点或重新编写所有查询以匹配CF_sql_VARCHAR和CF_sql_NVARCHAR与数据库设计的站点不会获得CF10之前不可避免的性能损失.

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

解决方法

当你正在等待更多官方的东西时,我会抛出我的$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'SELECT  ID
            FROM    Test
            WHERE   PlainVarcharColumn = @P1 ',дум великих полн'

    // Profiler (Setting dis-abled)
    exec sp_prepexec @p1 output,N'@P1 varchar(8000)','????? ??,??? ??????? ????'

原文地址:https://www.jb51.cc/mssql/75739.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐