nos*_*leg 12 coldfusion coldfusion-10
有关更新数据库的ColdFusion 10文档有关于ColdFusion 10中与数据库相关的增强功能的部分.那个页面提到现在有支持CF_SQL_NVARCHAR,但没有关于它们的细节.此外,cfqueryparam文档尚未更新以包含它们的存在.
cfqueryparam的ColdFusion 9文档提到CF_SQL_VARCHAR映射到varcharMSSQL中.除非ColdFusion Administrator 数据源设置已String Format启用该设置,否则这是正确的.在哪种情况下CF_SQL_VARCHAR映射到nvarchar.这个记录不完整的功能是一个hack,可能会导致 ColdFusion中的性能问题.
所以他们介绍的很棒CF_SQL_NVARCHAR,但了解它是如何工作的会很好.它只是CF_SQL_VARCHAR使它毫无意义的别名?它总是发送字符串nvarchar吗?如果是这样,CF_SQL_VARCHAR总是发送varchar?
我希望为了向后兼容,它实现如下:
如果String Format已启用CF_SQL_VARCHAR且CF_SQL_NVARCHAR两者都映射到nvarchar.
如果String Format已禁用,则CF_SQL_VARCHAR映射到varchar并CF_SQL_NVARCHAR映射到nvarchar.
这意味着任何CF10之前的站点都可以转移到CF10并运行,在CF10之前具有相同的性能考虑因素.
该重写所有查询新的网站,或者网站相匹配CF_SQL_VARCHAR,并CF_SQL_NVARCHAR与数据库设计将无法获得性能损失是不可避免的预CF10.
任何人都可以确认是否是这种情况; 如果有官方的东西更好吗?
Lei*_*igh 12
当你在等待更正式的东西时,我会投入0.02美元......
我做了一些挖掘并根据我的观察结果(使用MS SQL数据源)我相信:
CF_SQL_NVARCHAR不仅仅是别名CF_SQL_VARCHAR.它映射到较新的NVARCHAR jdbc类型,使您可以在更细粒度级别处理unicode值.
CF_SQL_NVARCHAR 值始终被视为 nvarchar
CF_SQL_VARCHAR取决于String Format设置,与以前的版本相同.CF_SQL_NVARCHAR测试/结果:
如果启用数据源日志记录,则可以看到驱动程序setNString在CF_SQL_NVARCHAR使用时调用特殊方法.所以最终将值作为发送到数据库nvarchar.(您可以使用SQL事件探查器确认)
// 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'????? ??, ??? ??????? ????'
Run Code Online (Sandbox Code Playgroud)
CF_SQL_VARCHAR测试/结果:
在这种情况下CF_SQL_VARCHAR,它在技术上被标记为varchar.但是,该String Format设置最终控制数据库如何处理它.启用该设置后,将其处理为nvarchar.禁用时,将其视为varchar.同样,您可以使用SQL事件探查器进行验证.
最重要的是,到目前为止我所看到的一切都表明你对实施的目标是正确的.
// 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 ','????? ??, ??? ??????? ????'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3880 次 |
| 最近记录: |