代码之家  ›  专栏  ›  技术社区  ›  Ben

Oracle wm_concat query返回奇数字符的结果集

  •  0
  • Ben  · 技术社区  · 15 年前

    我的Oracle查询生成正确的结果集,但数据显示为奇数字符,如下图中的块所示。

    alt text http://lh3.ggpht.com/_VSEi5_hEznA/TDtsnM9HDnI/AAAAAAAAAD8/zoEzbEaKB9s/blocks.jpg

    你能想到它为什么会这样做的原因吗?这些角色实际上是什么?下面是我使用的查询。事先谢谢。

    SELECT wmsys.wm_concat(userFirstName) AS firstNames
      FROM   COURSESECTION
      JOIN   CLASSCOORDINATOR on classcoord_sectionId = coursesect_sectionId
      JOIN   usr_USER on classcoord_coordinatorId = userId
    GROUP BY classcoord_sectionId;
    

    如果我使用相同的查询,但使用了dump(wmsys.wm_concat(columnname)),那么我将得到下图中显示的数据。

    alt text http://lh3.ggpht.com/_VSEi5_hEznA/TDx2dle4BmI/AAAAAAAAAEM/cP6opWer-Go/concat.jpg

    1 回复  |  直到 14 年前
        1
  •  1
  •   Gary Myers    15 年前

    dump是我研究字符集问题的起点。

    select wmsys.wm_concat('êõôó'), dump(wmsys.wm_concat('êõôó')) 
    from dual connect by level < 3;
    

    在我的数据库中(al32utf8,如从v$nls_参数查询nls_characterset参数所示),这将按预期返回。

    如何选择简单的userfirstname?

    我怀疑这些值来自多字符集环境,但不知何故被视为单字符集数据。


    编辑添加:

    我可以用以下方法复制:

    select * from v$nls_parameters
    where parameter = 'NLS_NCHAR_CHARACTERSET';
    
    AL16UTF16
    
    create table t (v nvarchar2(3));
    insert into t values ('a');
    select dump(v) from t;
    select wmsys.wm_concat(v), v, dump(v), dump(wmsys.wm_concat(v)) from t
    group by v;
    

    要补救,您可以尝试将字符串强制转换为标准varchar2

    select wmsys.wm_concat(cast(v as varchar2(3)))
    from t
    group by v;