Oracle数据库中如何去掉NUL字符?

2024-04-18

数据库: 我有一个 Oracle11g 数据库,其中有一个包含大约 1000 万行和大约 40 列的表。这些数据源自打孔卡时代,并已从一个 Oracle 版本转换到下一个版本多次。这是一个实时生产数据库,并且在某种程度上持续使用。但它并不是那么重要(尤其是在夜间),以至于我无法通过昂贵的查询和更新来对其施加压力。所以没关系。

编辑:字符集是 AL32UTF8。

问题: 我注意到有些列包含 NUL 字符。我发现由 1-4 个 NUL 字符组成的值,但理论上它们的数量可能多于该列可用的字符数。我想去掉 NUL 字符。如果值中只有 NUL 字符,我想将该列的值更改为 SQL NULL。如果其他字符之间有 NUL 字符(我还没有看到任何情况),我想删除它们(用“”替换)。

我尝试过的:

我注意到select rawtohex(mycolumn) from mytable例如返回“000000”(3 个 NUL 字符)。

select rawtohex('A') from dual;返回“61”

select rawtohex('Ä') from dual;返回“C385”。

我已经探索过寻找这样的 NUL 字符:

SELECT DISTINCT mycolumn 
FROM mytable
WHERE rawtohex(mycolumn) LIKE '%00%;'

到目前为止,我还没有找到任何包含 rawtohex 包含“00”字符的列,只有 NUL 字符的列除外。所以看起来像使用LIKE '%00%'是安全的。但我不确定 oracle 的 rawtohex 实现以及它使用哪种十六进制编码。

所以......当我继续探索这条道路并最终编写一个脚本来修复垃圾时,我问是否有人以前遇到过这项工作以及你是如何解决它的。 :)


我个人会用CHR() http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions026.htm#SQLRF00616来识别空值。 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)(相当于 nul)您可以返回带有 nul 的行。

DUMP() http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions055.htm#SQLRF00635返回数据类型(1 表示 VARCHAR2 http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#BABCGCHG) 字符串的长度(以字节为单位)和数据的内部表示;默认为二进制。

然而,你需要小心多字节数据 as 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() or DUMP()

换句话说,如果您没有多字节数据,那么最简单的事情就是replace http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions153.htm#SQLRF00697 it:

update <table>
   set <column> = replace(<column>, chr(0));

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

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 and 06那么返回值是1006你会发现00。如果要使用此方法,您必须确保只查看从字符串开头开始的两个字符组。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle数据库中如何去掉NUL字符? 的相关文章

随机推荐

  • CAPL 写入文本文件

    我对 CAPL 语言还很陌生 因此 我在将数据写入 txt 文件时遇到问题 这是我写的代码 includes variables message Generate Num Gen message Logger Logs msTimer ti
  • 在某些条件下使用钩子自动将一个分支合并到另一个分支?

    我的 github 存储库中有两个分支 master and dev分支 我有一个需要合并的要求master分支到dev在以下条件下分支 一旦 PR 直接合并到 master 分支 那么我需要自动将 master 分支合并回 dev 分支
  • 无法使用相同的私钥签署 Android 应用精简版

    我刚刚签署了我的付费应用程序 现在我想使用相同的私钥签署它的精简版 我现在的问题是 收到此错误 jarsigner 无法打开 jar 文件 我必须为其创建另一个密钥库吗 或者问题是否来自于我将其保存为不同的文件名 我能做些什么 谢谢 这个问
  • 在 Angular 8 应用程序中实现会话存储

    我正在构建一个电影应用程序来帮助我的学习 我想知道如何捕获按钮的点击次数并将其保存在会话存储中 我已经能够让点击工作了 它增加并显示每个按钮的点击次数 我用指令做到了这一点 我还尝试将按钮的 id 作为键和点击次数作为值附加到会话存储中 我
  • LabelledGeneric 获取类名

    我对 Shapeless 相当陌生 正如人们从我的问题中推断出来的那样 给定一个实例LabelledGeneric 如何获取它所代表的类的名称 我可以从中获取字段名称信息Keys 所以我想我需要一些其他类型的Witness它封装了类型本身
  • 如何在 Linq GroupBy 中选择前 N 行

    希望你能在这里帮助我 我有一个预订列表 我想在其中获取每组旅游运营商中的前两行 这是数据示例 List
  • JQUERY 对对象数组进行排序

    我有一个包含许多对象的数组 Array var activeMembers 上面数组中的 DIV 对象如下所示 每个对象一次添加一个 div class chatmember 1011 div div class chatmember 10
  • 如何让 gradle 和 cucumber 一起工作?

    让 gradle 干净利落地使用 Cucumber 是一个挑战 我想要得到gradle build编译并运行测试 但到目前为止我还没有成功 构建 gradle plugins id com github samueltbrown cucum
  • 如何处理 Xcode 警告“没有以前的函数原型...”?

    这个警告在一些第三方库中大量出现 有没有办法在不修改代码的情况下处理它 例如忽略警告 如果我必须修改代码来修复它 我该怎么做 这是导致警告的代码块之一 BOOL FBIsDeviceIPad if IPHONE OS VERSION MAX
  • 将 Flex 值动态添加到 extjs 中的控制器

    我在 视图 中给出了一些项目 容器 布局为hbox 现在我想给flex通过 控制器 为每个项目赋予值 我怎样才能做到这一点 我已经浏览了文档 但找不到任何类似的方法setFlex EDIT Ext apply Ext getCmp IdHe
  • R 每行分割字符串[重复]

    这个问题在这里已经有答案了 我有一个data frame like word count a b c 5 c d 3 c d e 10 我想分割每一行的字符串以获得以下结果 word count a 5 b 5 c 5 c 3 d 3 c
  • 给定类型的转换运算符与构造函数。哪个更可取?

    我正在为我的容器定义迭代器类型 当然我想要iterator可转换为const iterator 但我不确定哪个更好 更可取 中的转换运算符iterator class iterator operator const iterator 或非显
  • 尝试升级到 flink 1.3.1 时出现异常

    我尝试将集群中的 flink 版本升级到 1 3 1 以及 1 3 2 但我的任务管理器中出现以下异常 2018 02 28 12 57 27 120 ERROR org apache flink streaming runtime tas
  • Andengine,如何用触摸屏移动精灵

    我从 Andengine 开始 当我触摸屏幕 而不是精灵 时很难移动我的精灵 我真的需要你的帮助 非常感谢 这是我的代码 Override protected Scene onCreateScene final Scene scene ne
  • 用匿名方法定义backgroundworker的RunWorkerCompleted?

    我希望我使用了正确的术语 我的目标是这样的 我意识到它不会那样工作 private bool someBool false BackgroundWorker bg new BackgroundWorker bg DoWork new DoW
  • 结合前同级和后同级的 Xpath

    I am trying to read the values from this screen Sections appears dynamically it can be more than one We have to read eac
  • 装箱(或背包?)问题

    我收集了 43 到 50 个数字 范围从 0 133 到 0 005 但大部分都比较小 如果可能的话 我想找到 L 和 R 之和非常接近的所有组合 The brute force method takes 243 to 250 steps
  • UrlHelper.Action("Edit", "Ad") 返回 id 参数?

    Hi 我使用以下代码生成 URL UrlHelper urlHelper new UrlHelper htmlHelper ViewContext RequestContext urlHelper Action Edit Ad 如果我当前在
  • 如何重置爬虫URL缓存?

    我正在运行一个通过expressjs 调用调用的爬虫 当我再次调用相同的路线时 我的爬虫再次运行 但显示所有路线已经完成 我什至删除了 storage 文件夹 我阅读了文档 但似乎无法让 purgeDefaultStorages 工作 我将
  • Oracle数据库中如何去掉NUL字符?

    数据库 我有一个 Oracle11g 数据库 其中有一个包含大约 1000 万行和大约 40 列的表 这些数据源自打孔卡时代 并已从一个 Oracle 版本转换到下一个版本多次 这是一个实时生产数据库 并且在某种程度上持续使用 但它并不是那