如何在PL/SQL的BLOB字段中查找指定ASCII符号(如非断空格160)
在Oracle BLOB字段中查找特定ASCII字符(非断空格160)
BLOB存储的是二进制数据,dbms_lob.instr的第二个参数必须是RAW类型的二进制值,你之前的尝试无效主要是因为类型不匹配或编码对应错误,分两种场景解决:
场景1:BLOB存储单字节编码内容(如ASCII/ISO-8859-1)
非断空格(ASCII码160)对应的十六进制值是A0,直接用HEXTORAW('A0')作为参数即可:
select * from tableName where dbms_lob.instr(blobColumn, HEXTORAW('A0'), 1, 1) > 0;
也可以通过字符转RAW的方式实现:
select * from tableName where dbms_lob.instr(blobColumn, UTL_RAW.CAST_TO_RAW(CHR(160)), 1, 1) > 0;
场景2:BLOB存储UTF-8编码内容
UTF-8编码下,非断空格对应的二进制是双字节C2A0,需要传入这个十六进制对应的RAW值:
select * from tableName where dbms_lob.instr(blobColumn, HEXTORAW('C2A0'), 1, 1) > 0;
为什么之前的尝试无效?
- 直接传
CHAR(160):dbms_lob.instr要求第二个参数为RAW类型,字符类型的隐式转换会因字符集差异导致二进制值不匹配。 - 用
HEXTORAW('A0')无效:说明你的BLOB内容大概率是UTF-8编码,非断空格对应的是双字节C2A0而非单字节A0。
内容的提问来源于stack exchange,提问作者Dzak
相关产品推荐
相关产品推荐

