sql >> データベース >  >> RDS >> Oracle

sql / plsqlを使用して、テキストが使用する文字セットをどのように見つけますか?

    Oracle Globalization Development Kit 文字セットを検出できます。

    GDKはOracleに含まれていますが、デフォルトではデータベースにインストールされていません。 .jarファイルをデータベースにロードするには、Oraclehomeでjlibディレクトリを見つけて、次のオペレーティングシステムコマンドを実行します。

    loadjava -u [email protected] 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';
    /
    

    文字列をさまざまな言語に翻訳し、テキストエディタでテキストをさまざまなエンコーディングとして保存し、16進エディタでファイルを開き、16進を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には多くの機能があり、上記のコードは単純な出発点にすぎません。わずかな変更を加えるだけで、私の回答こちら に示されているようにコードで言語を検出することもできます。 。




    1. Pythonを使用したMySQLへの接続

    2. ODP.NETマネージド-要求された.NetFrameworkデータプロバイダーが見つかりません

    3. Oracleで連結文字列を生成する高速な方法

    4. SQLServerでプログラムによるデータベースの作成