修剪后未删除尾随 space
Trailing space is not removed after trimming
我运行这个查询:
select trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai')))) entete,
length(trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))))) nb
from details_param_import d join param_import_table p on d.param_code = p.param_code;
它给出了这个结果:
那么如何删除尾随 space 呢?
如果您 dump()
修改后的值,您可以看到末尾有一个空字节,而不是 space;并且 length()
仍然将其视为一个字符:
column entete format a20
column bytes format a40
with details_param_import (det_entete) as (
select 'nom' from dual
union all select 'prenom' from dual
)
select trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai')))) entete,
length(trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))))) nb,
dump(trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))))) bytes
from details_param_import d
/
ENTETE NB BYTES
-------------------- ---------- ----------------------------------------
nom 4 Typ=1 Len=4: 110,111,109,0
prenom 7 Typ=1 Len=7: 112,114,101,110,111,109,0
也就是 .
您可以明确地trim关闭:
with details_param_import (det_entete) as (
select 'nom' from dual
union all select 'prenom' from dual
)
select rtrim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))), chr(0)) entete,
length(rtrim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))), chr(0))) nb,
dump(rtrim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))), chr(0))) bytes
from details_param_import d
/
ENTETE NB BYTES
-------------------- ---------- ----------------------------------------
nom 3 Typ=1 Len=3: 110,111,109
prenom 6 Typ=1 Len=6: 112,114,101,110,111,109
这对你真正想做的事情是否有用是另一回事;查询归类键,而不是将其用于排序或比较,可能没有多大用处。您似乎正在使用它来删除字符串中的重音符号,但较长的值可能会被截断 (as the docs mention),即使对于较短的字符串,它似乎也不能保证您最终会得到您期望的结果。所以,如果有一天它坏了,请不要太惊讶。
我运行这个查询:
select trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai')))) entete,
length(trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))))) nb
from details_param_import d join param_import_table p on d.param_code = p.param_code;
它给出了这个结果:
那么如何删除尾随 space 呢?
如果您 dump()
修改后的值,您可以看到末尾有一个空字节,而不是 space;并且 length()
仍然将其视为一个字符:
column entete format a20
column bytes format a40
with details_param_import (det_entete) as (
select 'nom' from dual
union all select 'prenom' from dual
)
select trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai')))) entete,
length(trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))))) nb,
dump(trim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))))) bytes
from details_param_import d
/
ENTETE NB BYTES
-------------------- ---------- ----------------------------------------
nom 4 Typ=1 Len=4: 110,111,109,0
prenom 7 Typ=1 Len=7: 112,114,101,110,111,109,0
也就是
您可以明确地trim关闭:
with details_param_import (det_entete) as (
select 'nom' from dual
union all select 'prenom' from dual
)
select rtrim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))), chr(0)) entete,
length(rtrim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))), chr(0))) nb,
dump(rtrim(utl_raw.cast_to_varchar2((nlssort(d.det_entete, 'nls_sort=binary_ai'))), chr(0))) bytes
from details_param_import d
/
ENTETE NB BYTES
-------------------- ---------- ----------------------------------------
nom 3 Typ=1 Len=3: 110,111,109
prenom 6 Typ=1 Len=6: 112,114,101,110,111,109
这对你真正想做的事情是否有用是另一回事;查询归类键,而不是将其用于排序或比较,可能没有多大用处。您似乎正在使用它来删除字符串中的重音符号,但较长的值可能会被截断 (as the docs mention),即使对于较短的字符串,它似乎也不能保证您最终会得到您期望的结果。所以,如果有一天它坏了,请不要太惊讶。