gpt4 book ai didi

java - 在整个数据库中搜索一个乱码 `�` - Oracle

转载 作者:行者123 更新时间:2023-11-30 11:47:19 25 4
gpt4 key购买 nike

我们最近通过确保文件是 UTF-8 并且 Java 代码以 UTF-8 编码打开这些文件,解决了字符编码被错误地从文本文件读入我们系统的问题.

但是,我们最终在整个数据库表中添加了大量记录,其中插入了不正确的字符,即 °F 被读取为 �F。所以即使我们现在已经修复了这个问题,我们现在也需要清理数据库表来纠正这个异常。

任何人都可以建议我实现这一目标的方法吗?

最佳答案

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

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

  1. 禁用外键约束
  2. 建立一个表格列表,其中包含目标列
  3. 使用一个更新列表中的所有表 REGEXP_REPLACE
  4. 提交数据重新启用约束

这使用了大量的动态 SQL,从 user_constraintsuser_tab_columns 中提取数据,过滤我定位的特定列名。

这是一个可以帮助您入门的粗略框架,我只是快速将其组合在一起,因此未经过测试。此外,如果您担心触发器,您也需要禁用它们:

-- 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;
/

关于java - 在整个数据库中搜索一个乱码 `�` - Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9372190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com