在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)','????? ??,??? ??????? ????'

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...