Oracle11g 如何编写sql语句来替换所有x';BF&x27;用x';00';对于包含ascii下边的特定数据字段?将其替换为空x';00';

Oracle11g 如何编写sql语句来替换所有x';BF&x27;用x';00';对于包含ascii下边的特定数据字段?将其替换为空x';00';,oracle11g,Oracle11g,如何正确编写此代码以在Oracle SQL中工作: 更新表名称 设置字段名称= 替换(字段名称,x'BF',x'00') where条件表达式 不确定如何用数据字段名称中包含的空值十六进制'00'替换所有出现的十六进制'BF'。您可以使用它来提供Unicode字符。e、 g: update table_name set field_name = replace(field_name, unistr('\00bf')) where condition expression ; 这将完全删除?字符

如何正确编写此代码以在Oracle SQL中工作:

更新表名称 设置字段名称= 替换(字段名称,x'BF',x'00') where条件表达式

不确定如何用数据字段名称中包含的空值十六进制'00'替换所有出现的十六进制'BF'。

您可以使用它来提供Unicode字符。e、 g:

update table_name
set field_name = replace(field_name, unistr('\00bf'))
where condition expression ;
这将完全删除
字符;或将其替换为空字符:

set field_name = replace(field_name, unistr('\00bf'), unistr('\0000'))
尽管我怀疑在其中插入空值会使以后的事情更加混乱,当其他系统尝试读取该文本并在空值处停止时

快速演示:

with t (str) as (
  select 'A ¿ char' from dual
)
select str,
  replace(str, unistr('\00bf')) as removed,
  replace(str, unistr('\00bf'), unistr('\0000')) as replaced,
  dump(replace(str, unistr('\00bf')), 16) as removed_hex,
  dump(replace(str, unistr('\00bf'), unistr('\0000')), 16) as replaced_hex
from t;

STR       REMOVED   REPLACED  REMOVED_HEX                         REPLACED_HEX
--------- --------- --------- ----------------------------------- -----------------------------------
A ¿ char  A  char   A   char  Typ=1 Len=7: 41,20,20,63,68,61,72   Typ=1 Len=8: 41,20,0,20,63,68,61,72
(作为您将遇到的问题的一个示例-由于空值,我无法从SQL Developer复制和粘贴它,并且必须切换到SQL*Plus…)


第一个转储显示相邻的两个空间(十六进制20);第二个显示它们之间的空字符。

我不认为您真的想用空字符替换它们,这只会在以后其他东西尝试使用字符串时给您带来更多问题。如果您确定原始角色无法恢复,您可能希望完全删除它们。我更担心的是数据是如何进入的。我相信用户是在对某些文本进行剪切/粘贴,这导致了字符的下移?想用十六进制'00'替换它,这类似于用空格替换alt制表符,就这一点而言,他们想要00,只要它不是重音字符、智能引号或其他东西——这是合法的,但由于字符集不匹配/转换而丢失。我仍然认为用空字符替换它不是一个好主意,但这是您的数据*8-)