加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 08:39:37 所属栏目:MsSql教程 来源:网络整理
导读:关于更新数据库的ColdFusion 10文档有一个部分在 Database-related enhancements in ColdFusion 10.该页面提到现在支持CF_SQL_NVARCHAR等,但没有关于它们的细节.此外,cfqueryparam documentation尚未更新以包含其存在. ColdFusion 9 documentation for cfquer
关于更新数据库的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)','????? ??,??? ??????? ????'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读