Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ColdFusion 10中使用CF_SQL_NVARCHAR的详细信息是什么?_Coldfusion_Coldfusion 10 - Fatal编程技术网

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

在ColdFusion 10中使用CF_SQL_NVARCHAR的详细信息是什么?,coldfusion,coldfusion-10,Coldfusion,Coldfusion 10,有关更新数据库的ColdFusion 10文档中有一节介绍。该页面提到现在支持CF\u SQL\u NVARCHAR,但没有详细说明。此外,还没有更新以包含它们的存在 提到CF\u SQL\u VARCHAR映射到MSSQL中的VARCHAR。除非ColdFusion管理员启用了字符串格式设置,否则这是正确的。在这种情况下,CF\u SQL\u VARCHAR映射到nvarchar。这个文档记录不完整的特性是一个可以在ColdFusion中使用的黑客攻击 因此,他们引入了CF\u SQL\u N

有关更新数据库的ColdFusion 10文档中有一节介绍。该页面提到现在支持
CF\u SQL\u NVARCHAR
,但没有详细说明。此外,还没有更新以包含它们的存在

提到
CF\u SQL\u VARCHAR
映射到MSSQL中的
VARCHAR
。除非ColdFusion管理员启用了
字符串格式设置,否则这是正确的。在这种情况下,
CF\u SQL\u VARCHAR
映射到
nvarchar
。这个文档记录不完整的特性是一个可以在ColdFusion中使用的黑客攻击

因此,他们引入了
CF\u SQL\u NVARCHAR
,这很好,但了解它的工作原理会很好。它仅仅是
CF\u SQL\u VARCHAR
的别名,让它变得毫无意义?它是否总是以
nvarchar
的形式发送字符串?如果是这样的话,
CF\u SQL\u VARCHAR
是否总是发送
VARCHAR

为了向后兼容,我希望它的实现如下:

如果启用了
String Format
CF\u SQL\u VARCHAR
CF\u SQL\u NVARCHAR
则两者都映射到
NVARCHAR

如果禁用了
String Format
,则
CF\u SQL\u VARCHAR
映射到
VARCHAR
,而
CF\u SQL\u NVARCHAR
映射到
NVARCHAR

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

新站点,或重写所有查询以匹配数据库设计的
CF_SQL\u VARCHAR
CF_SQL\u NVARCHAR
的站点将不会受到CF10之前不可避免的性能损失


是否有人能证实这一点;如果有更正式的东西就更好了?

当你在等待更正式的东西时,我会投入我的0.02美元

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

  • CF\u SQL\u NVARCHAR
    不仅仅是
    CF\u SQL\u VARCHAR
    的别名。它映射到较新版本,这使您能够在更精细的级别上处理unicode值

  • CF\u SQL\u NVARCHAR
    值始终被视为
    NVARCHAR

  • CF\u SQL\u VARCHAR
    的处理取决于设置,与以前的版本相同
CF\u SQL\u NVARCHAR测试/结果:

如果启用数据源日志记录,则可以看到驱动程序在使用
CF\u SQL\u NVARCHAR
时调用特殊方法。因此,最终将值作为
nvarchar
发送到数据库。(您可以使用SQL探查器确认这一点)


“当设置被启用时,它被当作varchar处理。当它被禁用时,它被当作nvarchar处理。”我想你的意思是相反的?是的。谢谢你指出这一点。当我看到您的评论时,我正在修复它。@Leigh,您如何在驱动程序上启用数据源日志记录?
    // 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'Стоял он, дум великих полн'
    // 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 ','????? ??, ??? ??????? ????'