当前位置: 首页 > 面试题库 >

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

潘翰藻
2023-03-14
问题内容

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

我想通过Oracle过程找出每个文档的字符集。我不想使用CSSCAN实用程序,因为看来您必须在过程之外的单独会话中使用它。

谢谢你的帮助!


问题答案:

Oracle全球化开发套件可以检测字符集。

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)


 类似资料:
  • 我要使用集合中包含的日期字段查找文档 我想找到以'2018-01-03T11:00:'开头的所有文档 我想忽略Millesecobde和ISOtype..等的部分 无论第二个只是核实日期,小时和分钟。

  • 问题内容: 我到处都看到JRE,但是我不确定哪个JDK正在编译我的代码。我如何找到? 问题答案: 实际上,Eclipse有其自己的编译器。您可以仅使用JRE和Eclipse开发Java应用程序

  • 我正在尝试开发一个简单的搜索引擎,以获得匹配的句子在一个文本文件与nodejs,但我想改进我的搜索引擎,以获得相似的文本,而不仅仅是准确的文本,有什么建议,我可以如何做到这一点? 这是我的代码:

  • 问题内容: 在Java中,我来自一个名为“ text”的String变量中的文本字段中的文本。 如何将“文本”变量的内容保存到文件中? 问题答案: 如果你只是输出文本,而不是任何二进制数据,则可以执行以下操作: 然后,将String写入其中,就像写入任何输出流一样: 与以往一样,你将需要异常处理。完成写作后,请务必致电。 如果你使用的是Java 7或更高版本,则可以使用“ 语句 ”,该语句将Pri

  • 问题内容: 如果我在不带字符“ |”的脚本下运行 它正常工作,但是当我添加字符“ |”时 如何添加字符“ |”不起作用 使用sql脚本将文本文件? 谢谢 问题答案: 管道字符在批处理命令中具有特殊含义,因此必须使用脱字符将其转义。这应该工作: 尽管这实际上不是将数据写入文本文件的好方法:通常,SQL Server不应具有写入C:驱动器根目录的权限,并且默认情况下处于禁用状态。我建议你看看喜欢的替代

  • 问题内容: 如何使用bash脚本查找出现字符串的行号? 例如,如果文件看起来像这样, 我运行脚本来查找字符串“ line”,它将输出数字2,因为它是第一次出现。 问题答案: 鉴于您的示例仅显示字符串首次出现的行号,也许您正在寻找: 如果您确实希望所有出现(例如,如果您的示例的期望输出实际上是“ 2 \ n3 \ n”),请省略。