What are the details for using CF_SQL_NVARCHAR in ColdFusion 10?

前端 未结 1 1010
一整个雨季
一整个雨季 2020-11-28 13:02

The ColdFusion 10 documentation on Updating Your Database has a section on Database-related enhancements in ColdFusion 10. That page mentions that there is now support for

相关标签:
1条回答
  • 2020-11-28 13:23

    While you are waiting for something more official, I will throw in my $0.02 ...

    I did some digging and based on my observations (with an MS SQL datasource) I believe that:

    • CF_SQL_NVARCHAR is not just an alias for CF_SQL_VARCHAR. It maps to the newer NVARCHAR jdbc type, which lets you to handle unicode values at a more granular level.

    • CF_SQL_NVARCHAR values are always treated as nvarchar

    • The handling of CF_SQL_VARCHAR depends on the String Format setting, same as in previous versions.

    CF_SQL_NVARCHAR Test/Results:

    If you enable datasource logging, you can see the driver invokes the special setNString method whenever CF_SQL_NVARCHAR is used. So ultimately the value is sent to the database as nvarchar. (You can confirm this with a 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 Test/Results:

    In the case of CF_SQL_VARCHAR, it is technically flagged as varchar. However, the String Format setting ultimately controls how it is handled by the database. When the setting is enabled, it is handled as nvarchar. When it is disabled, it is treated as varchar. Again, you can verify this with a SQL Profiler.

    Bottom line, everything I have seen so far says you are right on target about the implementation.

        // 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 ','????? ??, ??? ??????? ????'
    
    0 讨论(0)
提交回复
热议问题