sql - 使用sql/plsql,如何找出文本使用的字符集?

标签 sql oracle plsql character-encoding

我有一个 Oracle 数据库,它存储来自世界各地、不同语言的文档内容。文档存储在一个带有 BLOB 列的表中,该列存储文档的内容。

我想通过 Oracle 过程找出每个文档的字符集是什么。我不想使用实用程序 CSSCAN,因为您似乎必须在程序之外的单独 session 中使用它。

感谢您的帮助!

最佳答案

Oracle Globalization Development Kit 可以检测字符集。

GDK 包含在 Oracle 中,但默认情况下不安装在数据库中。要将 .jar 文件加载到数据库中,请在 Oracle 中找到 jlib 目录 主页并运行此操作系统命令:

loadjava -u USER_NAME@SID orai18n.jar orai18n-collation.jar orai18n-lcsd.jar orai18n-mapping.jar orai18n-net.jar orai18n-servlet.jar orai18n-tools.jar orai18n-translation.jar orai18n-utility.jar

即使您的用户拥有 DBA,也需要一些额外的 Java 权限。运行此命令,然后重新连接:

exec dbms_java.grant_permission( 'YOUR_USER_NAME', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '' );

创建一个Java类来进行检测。下面是一个非常简单的示例,它返回字符串的最佳猜测:

create or replace and compile java source named "Character_Set_Detector"
as
import oracle.i18n.lcsd.*;
import java.sql.*;
import java.io.IOException;
public class Character_Set_Detector
{
    public static String detect(Blob some_blob) throws SQLException, IOException
    {
        LCSDetector detector = new LCSDetector();
        detector.detect(some_blob.getBinaryStream());
        LCSDResultSet detector_results = detector.getResult();
        return detector_results.getORACharacterSet();
    }
}
/

将 Java 类包装在 PL/SQL 函数中:

--Wrap the Java class in a PL/SQL function:
create or replace function detect_character_set(some_blob blob)
return varchar2
as language java
name 'Character_Set_Detector.detect(java.sql.Blob) return java.lang.String';
/

我通过将字符串翻译成不同的语言、使用文本编辑器将文本保存为不同的编码、使用十六进制编辑器打开文件并将十六进制转换为 BLOB 来模拟不同的字符集:

--UTF8
--The quick brown fox jumps over the lazy dog
select 1 id, detect_character_set(hextoraw('54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67')) character_set from dual union all
--Western European (ISO-8859-1)
--El zorro marrón rápido salta sobre el perro perezoso
select 2 id, detect_character_set(hextoraw('456c207a6f72726f206d617272f36e2072e17069646f2073616c746120736f62726520656c20706572726f20706572657a6f736f')) from dual union all
--Chinese Simplified (GBK)
--敏捷的棕色狐狸跳过懒狗
select 3 id, detect_character_set(hextoraw('c3f4bdddb5c4d7d8c9abbafcc0eaccf8b9fdc0c1b9b7')) from dual union all
--Western European (Windows-1252)
--Der schnelle braune Fuchs springt über den faulen Hund
select 4 id, detect_character_set(hextoraw('446572207363686e656c6c6520627261756e6520467563687320737072696e677420fc6265722064656e206661756c656e2048756e64')) from dual union all
--Cyrillic (KOI8-R)
--Быстрая коричневая лиса прыгает через ленивую собаку
select 5 id, detect_character_set(hextoraw('e2d9d3d4d2c1d120cbcfd2c9decec5d7c1d120ccc9d3c120d0d2d9c7c1c5d420dec5d2c5da20ccc5cec9d7d5c020d3cfc2c1cbd5')) from dual;

ID  CHARACTER_SET
--  -------------
1   US7ASCII
2   WE8ISO8859P1
3   ZHS16CGB231280
4   WE8ISO8859P1
5   CL8KOI8R

这个简单的示例效果很好,但我不知道它与实际文件的配合效果如何。 GDK中有很多功能,上面的代码只是一个简单的起点。只需进行微小的更改,代码就可以检测语言,如我的答案 here 中所示。

关于sql - 使用sql/plsql,如何找出文本使用的字符集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34885337/

相关文章:

sql server数据集行到列

SQL Server - 对整个列求和并分组

c# - 如何从 C# 运行 Oracle 函数(对比 2012)

oracle - ORA-03001 : unimplemented feature when converting XMLTYPE to NCLOB from table

plsql - 如何限制 PL/SQL 代码对输入参数执行两次相同的值?

c# - 甲骨文和事件目录 : A love/hate relationship

PHP SQL - 更新搜索结果的数据

php - Mysql性能,一表二

java - resultSet.next() 是做什么的

java - ORA-01780 : string literal required using prepared statement