oracle手机号尾号多了nul,oracle - 如何摆脱Oracle数据库中的NUL字符? - 堆栈内存溢出...

就个人而言,我会使用CHR()来识别零值。 nul是ASCII 0, CHR()将返回您传入的数字的字符表示。

SQL> with the_data as (

2 select 'a' || chr(0) || 'b' as str from dual

3 union all

4 select 'a' || 'c' from dual

5 )

6 select dump(str)

7 from the_data

8 where str like '%' || chr(0) || '%'

9 ;

DUMP(STR)

----------------------------------------------------

Typ=1 Len=3: 97,0,98

正如您所看到的那样,通过连接CHR(0)周围的百分比符号CHR(0)相当于nul),您可以返回带有nul的行。

DUMP()返回数据类型( 1表示VARCHAR2 )字符串的长度(以字节为单位)和数据的内部表示形式; 默认为二进制。

但是, 您需要注意多字节数据,因为CHR()返回的数字的模数等于256:

SQL> with the_data as (

2 select 'a' || chr(0) || 'b' as str from dual

3 union all

4 select 'a' || chr(256) || 'c' from dual

5 )

6 select dump(str)

7 from the_data

8 where str like '%' || chr(0) || '%'

9 ;

DUMP(STR)

-------------------------------------------------

Typ=1 Len=3: 97,0,98

Typ=1 Len=4: 97,1,0,99

正如你所看到的,你会错误地在这里找到一个nul,使用CHR()或DUMP()

换句话说,如果您没有多字节数据,那么最简单的方法就是替换它:

update

set = replace(, chr(0));

使用RAWTOHEX()有类似的问题; 虽然你可以找到00但不能保证它实际上是一个零点:

SQL> with the_data as (

2 select 'a' || chr(0) || 'b' as str from dual

3 union all

4 select 'a' || chr(256) || 'c' from dual

5 )

6 select rawtohex(str)

7 from the_data

8 where str like '%' || chr(0) || '%'

9 ;

RAWTOHEX

--------

610062

61010063

它实际上还有一个问题; 想象你有两个字符10和06 ,返回的值是1006 ,你会找到00 。 如果您要使用此方法,则必须确保仅从字符串的开头查看两个字符组。

由于nul字符的内部表示用于表示其他多字节字符的部分,因此您不能只替换它们,因为您不知道它是一个字符还是半个字符。 因此,如果您使用多字节字符集,据我所知,您将无法执行此操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值