2009-10-13 7 views
2

Je viens de découvrir un peu ... Je ne sais pas ce que je l'appelle, mais va ici:fonction longueur Oracle() retour valeur incorrecte

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

... Résultats:

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 

L'entier renvoyé par l'appel length() renvoie en réalité 1 + realLength des valeurs.

Je ne sais pas par où commencer, quelqu'un veut faire la lumière?

Répondre

5

Essayez de regarder le détail du champ en utilisant le construit en fonction DUMP

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

Cela renverra des données comme

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

de cette requête

SELECT dump('Oracle') from dual 
3

Vous avez probablement un caractère non visible (comme un CR) à la fin de ces part_nums que TRIM() ne supprime pas.

Juste une supposition. :-)

Essayez de les encadrer avec '[' || part_num || ']' dans le select et voyez si vous remarquez un espace blanc supplémentaire de chaque côté du champ.

+0

Cela ressemble une supposition assez juste - pour tester, exécuter une instruction d'insertion avec des données connues et voir ce que cela produit en tant que longueur. En outre, si vous avez UNIX et une interface de ligne de commande SQL, essayez quelque chose comme "oracle select part_num from part_programs | od -xcb" pour obtenir un vidage hexadécimal de la sortie - qui peut montrer des caractères douteux dans la colonne. – paxdiablo

+0

Bracketing est une bonne idée - j'aime ça. Pour obtenir la vraie longueur, vous pouvez essayer quelque chose comme: longueur (trim (remplacer (remplacer (partie_num, chr (10)), chr (13)))) –

Questions connexes