Функция Oracle length (), возвращающая неверное значение

Я только что нашел ... Я не знаю, как бы я это назвал, но здесь идет:

SELECT part_num, 
       length(trim(part_num)) 
  FROM part_programs 
 WHERE rownum <= 10;

...Результаты:

PART_NUM        LENGTH(TRIM(PART_NUM))
--------------- ----------------------
THAB256         8
THA1256674      11
THA1256674GU    13
THA1257141      11
THA1257141FR    13
THA1257141FR1   14
THA1257141TD    13
THA2002013      11
THA2002013MI    13
THA2002013MI1   14

Возвращенное целое число из вызова length () фактически возвращает 1 + realLength значений.

Я не уверен, с чего начать, кто-нибудь хочет пролить свет?

13.10.2009 04:21:49
2 ОТВЕТА
РЕШЕНИЕ

Попробуйте посмотреть на детали поля, используя встроенную функцию DUMP

SELECT part_num,
       length(trim(part_num)),
       dump( trim( part_num ) )
  FROM part_programs  
 WHERE rownum <= 10;

Это вернет данные как

Typ=96 Len=6: 79,114,97,99,108,101

из этого запроса

SELECT dump( 'Oracle' ) from dual
5
13.10.2009 14:15:12

Возможно, у вас есть невидимый символ (например, CR) в конце тех part_nums, которые TRIM () не удаляет.

Просто предположение. :-)

Попробуйте заключить их в скобки с помощью '[' || part_num || ']' в выделенном и посмотрите, заметили ли вы какие-либо дополнительные пробелы по обе стороны поля.

3
27.09.2011 16:03:13
Это звучит как достаточно справедливое предположение - проверить, выполнить оператор вставки с известными данными и посмотреть, что это выводит в виде длины. Кроме того, если у вас UNIX и интерфейс командной строки SQL, попробуйте что-то вроде «oracle select part_num from part_programs | od -xcb», чтобы получить шестнадцатеричный дамп выходных данных - в столбце могут отображаться хитрые символы.
paxdiablo 13.10.2009 04:35:40
Брекетинг - хорошая идея, мне это нравится. Чтобы получить реальную длину, вы можете попробовать что-то вроде: длина (обрезать (заменить (заменить (заменить (part_num, chr (10)), chr (13))))
Nick Pierpoint 13.10.2009 13:05:45