我们目前正在将我们的一个 Oracle 数据库迁移到 UTF8,我们发现有几条记录接近 4000 字节的 varchar 限制。 当我们尝试迁移这些记录时,由于其中包含的字符变成了多字节 UF8 字符,因此迁移失败。 我想在 PL/SQL 中找到这些字符,看看它们是什么,然后更改或删除它们。
我想做的是:
SELECT REGEXP_REPLACE(COLUMN,'[^[:ascii:]],'')
但 Oracle 没有实现 [:ascii:] 字符类。
有什么简单的方法可以实现我想做的事情吗?
也许有一种使用正则表达式的更直接的方法。运气好的话,会有人提供。但我的做法是不需要查阅手册。
创建一个 PLSQL 函数,接收输入字符串并返回一个 varchar2。
在 PLSQL 函数中,对输入字符串执行 asciistr()。之所以使用 PLSQL 函数,是因为该函数可能会返回一个长度超过 4000 的字符串,而 PLSQL 中的 varchar2 有 32K 可用。
该函数会将非 ASCII 字符转换为 \xxxx 符号。因此,你可以使用正则表达式查找并删除这些字符。然后返回结果。
我也遇到过类似的问题,并在博客 这里 中进行了讨论。 我从字母数字的正则表达式开始,然后添加了几个我喜欢的基本标点符号:
select dump(a,1016), a, b
from
(select regexp_replace(COLUMN,'[[:alnum:]/''%()> -.:=;[]','') a,
COLUMN b
from TABLE)
where a is not null
order by a;
我使用 1016 变体 dump 来给出我想替换的十六进制字符,然后在 utl_raw.cast_too_varchar2 中使用这些字符。