Запрос Oracle wm_concat возвращает набор результатов с нечетными символами - PullRequest
0 голосов
/ 12 июля 2010

Мой запрос Oracle дает правильный набор результатов, но данные представлены нечетными символами, как вы можете видеть по блокам на рисунке ниже.

альтернативный текст 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;

Если я использую тот же запрос, но использую дамп (wmsys.wm_concat (columnName)), то я получаю данные, представленные на рисунке ниже.

альтернативный текст http://lh3.ggpht.com/_VSEi5_hEznA/TDx2dle4BmI/AAAAAAAAAEM/cP6opWer-Go/concat.jpg

1 Ответ

1 голос
/ 13 июля 2010

DUMP - это моя отправная точка при расследовании проблем с наборами символов.

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

В моей базе данных (AL32UTF8, как показано запросом параметра NLS_CHARACTERSET из v $ nls_parameters), возвращается, как и ожидалось.1005 * Как отображается выбор простого 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;
...