sql >> Database teknologi >  >> RDS >> Oracle

Ved hjælp af sql/plsql, hvordan finder du ud af, hvilket tegnsæt en tekst bruger?

Oracle Globalization Development Kit kan registrere tegnsæt.

GDK er inkluderet i Oracle, men det er ikke installeret i databasen som standard. For at indlæse .jar-filerne i databasen, find jlib-mappen i Oraclehome og kør denne styresystemkommando:

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
 

Nogle ekstra Java-privilegier er nødvendige, selvom din bruger har DBA. Kør denne kommando, og opret forbindelse igen:

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

Opret en Java-klasse for at udføre detektionen. Nedenfor er et meget simpelt eksempel, der returnerer det bedste gæt for en streng:

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

Pak Java-klassen ind i en PL/SQL-funktion:

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

Jeg simulerede forskellige tegnsæt ved at oversætte en streng til forskellige sprog, gemme teksten som forskellige kodninger med en teksteditor, åbne filen med hex editor og konvertere hex til en 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
 

Det trivielle eksempel fungerer godt, men jeg ved ikke, hvor godt det vil fungere med filer fra den virkelige verden. Der er mange funktioner i GDK, ovenstående kode er kun et simpelt udgangspunkt. Med kun mindre ændringer kan koden også registrere sprog som vist i mit svar her .




  1. SQL Server 2016:Gem forespørgselsresultater til en CSV-fil

  2. PHP Fatal fejl:Ufanget PDOException:kunne ikke finde driveren

  3. Forkert DateTime Værdi '0000-00-00 00:00:00' - Date_Sub() i at have

  4. opdatere flere rækker ved hjælp af limit i mysql?