首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在整个数据库中搜索乱码`�‘- Oracle

在整个数据库中搜索乱码`�‘- Oracle
EN

Stack Overflow用户
提问于 2012-02-21 12:29:57
回答 1查看 455关注 0票数 2

我们最近修复了一个问题,即从文本文件中错误地读取字符编码到我们的系统中,方法是确保文件是UTF-8,并且Java代码以UTF-8编码打开这些文件。

然而,我们最终在整个数据库表中添加了大量插入了错误字符的记录,即°F被读取为�F。因此,即使我们现在已经修复了这个问题,我们现在也需要清理数据库表来纠正这种异常。

有没有人能给我建议一下实现这个目标的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-21 12:37:50

前段时间我也遇到过类似的问题。幸运的是,受其影响的列数有限,并且这些列在整个数据库中具有相同的名称。

我通过编写一个执行以下操作的脚本解决了这个问题:

  1. 禁用外键提交包含目标列的表的列表
  2. 使用REGEXP_REPLACE

更新列表中的所有表

  1. 提交数据重新启用约束

这使用了一种健康的动态SQL,从user_constraintsuser_tab_columns中提取数据,过滤我所针对的特定列名。

这里有一个粗略的框架,我只是快速地把它组装在一起,所以它没有经过测试。此外,如果您需要担心触发器,则需要禁用这些触发器:

代码语言:javascript
复制
-- disable constraints
BEGIN
    FOR c IN (
        SELECT c.owner, c.table_name, c.constraint_name, c.constraint_type
        FROM user_constraints c
        INNER JOIN user_tables t ON (t.table_name = c.table_name)
        AND c.status = 'ENABLED'
        AND c.constraint_type NOT IN ('C', 'P')
        ORDER BY c.constraint_type DESC
    )
    LOOP
        dbms_utility.exec_ddl_statement('alter table '||c.table_name||' disable constraint ' || c.constraint_name);
    END LOOP;
END;

-- do the updates
BEGIN
    FOR t IN (
        SELECT table_name, column_name
        FROM user_tab_columns
        WHERE column_name = 'TEMPERATURE'
        AND data_type = 'VARCHAR2';
    )
    LOOP
        dbms_utility.exec_ddl_statement('UPDATE '||t.table_name||' SET ' ||t.column_name||' = '||''GOOD VALUE''||' WHERE '||t.column_name||' = '||''BAD VALUE'');
    END LOOP;
END;

-- re-enable constraints
BEGIN
    FOR c IN (
        SELECT c.owner, c.table_name, c.constraint_name, c.constraint_type
        FROM user_constraints c
        INNER JOIN user_tables t ON (t.table_name = c.table_name)
        AND c.status = 'DISABLED'
        AND c.constraint_type NOT IN ('C', 'P')
        ORDER BY c.constraint_type ASC
    )
    LOOP
        dbms_utility.exec_ddl_statement('alter table '||c.table_name||' enable constraint ' || c.constraint_name);
    END LOOP;
END;
/
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9372190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档