我正在寻找修复 Oracle 中的数据表,最好是通过非特权 SQL,该 SQL 已将 UTF-8 数据插入到 UTF-8 数据库中,错误地使用了 Latin-1 字符集。
该符号β GREEK SMALL LETTER BETA
应该已经进入数据库,但是这两个字符β
已经进入......因为两个 UTF-8 字符
Î LATIN CAPITAL LETTER I WITH CIRCUMFLEX
后跟² SUPERSCRIPT TWO
.
此示例代码演示了问题和修复,但它仅适用于VARCHAR
列。一旦CLOB
使用 a ,转换就会失败:
-- This must return AL32UTF8 for this example to be valid
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
CREATE TABLE EXAMPLE (T VARCHAR2(20));
INSERT INTO EXAMPLE (T) VALUES ('Example β');
SELECT T FROM EXAMPLE; -- Should return 'Example β'
SELECT CONVERT(T, 'WE8ISO8859P1') FROM EXAMPLE;
UPDATE EXAMPLE SET T=CONVERT(T, 'WE8ISO8859P1');
SELECT T FROM EXAMPLE; -- Should return 'Example β', problem fixed
DROP TABLE EXAMPLE;
但是,如果将VARCHAR2(20)
其更改为CLOB
则不再有效。 CONVERT()
返回垃圾字符。我可以TO_CHAR()
用来解决这个问题,但最终我得到一个错误,它CLOB
超过 4000 个字符,所以TO_CHAR()
失败了。
CLOB
当使用超过 4000 个字符的列时,有没有办法让上述示例正常工作?
DBMS_LOB
包也有转换功能。不幸的是,不支持将 CLOB 转换为 CLOB 并一步更改字符集,因此数据首先转换为 BLOB,然后再转换回 CLOB。现在转换部分: