2009-10-13 4 views
2

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

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 значений.

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

ответ

5

Попробуйте посмотреть на детали поля, используя встроенную функцию 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 
3

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

Просто догадаться. :-)

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

+0

Это звучит как достаточно догадка - проверить, выполнить инструкцию insert с известными данными и посмотреть, что это выводит как длину. Кроме того, если у вас есть UNIX и интерфейс командной строки SQL, попробуйте что-то вроде «oracle select part_num from part_programs | od -xcb», чтобы получить шестнадцатеричный дамп вывода - это может вызвать изворотливость символов в столбце. – paxdiablo

+0

Брекетинг - хорошая идея - мне это нравится. Чтобы получить реальную длину, вы можете попробовать что-то вроде: length (trim (replace (replace (part_num, chr (10)), chr (13)))) –

Смежные вопросы