sql >> Database >  >> RDS >> Oracle

Hoe kom je er met behulp van sql/plsql achter welke tekenset een tekst gebruikt?

Oracle Globalization Development Kit kan tekensets detecteren.

De GDK wordt meegeleverd met Oracle, maar wordt niet standaard in de database geïnstalleerd. Om de .jar-bestanden in de database te laden, zoekt u de jlib-directory in de Oraclehome en voert u deze opdracht van het besturingssysteem uit:

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

Er zijn enkele extra Java-rechten nodig, zelfs als uw gebruiker DBA heeft. Voer deze opdracht uit en maak vervolgens opnieuw verbinding:

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

Maak een Java-klasse om de detectie uit te voeren. Hieronder is een heel eenvoudig voorbeeld dat de beste schatting voor een tekenreeks retourneert:

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();
    }
}
/

Wikkel de Java-klasse in een PL/SQL-functie:

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

Ik heb verschillende karaktersets gesimuleerd door een string in verschillende talen te vertalen, de tekst op te slaan als verschillende coderingen met een teksteditor, het bestand te openen met hex-editor en de hex om te zetten in een 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

Dat triviale voorbeeld werkt goed, maar ik weet niet hoe goed het zal werken met echte bestanden. Er zijn veel functies in de GDK, de bovenstaande code is slechts een eenvoudig startpunt. Met slechts kleine wijzigingen kan de code ook talen detecteren, zoals aangetoond in mijn antwoord hier .




  1. MERGE:bijwerken van bron- en doeltabellen die zich op afzonderlijke servers bevinden

  2. Aanroepen van de privéfunctie binnen de hoofdtekst van het pakket

  3. Sla bepaalde tabellen over met mysqldump

  4. Hoe kan ik de eerste rij SELECTEREN met MAX (kolomwaarde)?