sql >> Databasteknik >  >> RDS >> Oracle

Hur tar du reda på vilken teckenuppsättning en text använder med sql/plsql?

Oracle Globalization Development Kit kan upptäcka teckenuppsättningar.

GDK ingår i Oracle men är inte installerat i databasen som standard. För att ladda .jar-filerna till databasen, leta reda på jlib-katalogen i Oraclehome och kör det här operativsystemkommandot:

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

Vissa extra Java-privilegier behövs, även om din användare har DBA. Kör det här kommandot och anslut sedan igen:

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

Skapa en Java-klass för att göra upptäckten. Nedan är ett mycket enkelt exempel som ger den bästa gissningen för en sträng:

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

Slå in Java-klassen 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';
/

Jag simulerade olika teckenuppsättningar genom att översätta en sträng till olika språk, spara texten som olika kodningar med en textredigerare, öppna filen med hex editor och konvertera hex till 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 triviala exemplet fungerar bra men jag vet inte hur bra det kommer att fungera med verkliga filer. Det finns många funktioner i GDK, ovanstående kod är bara en enkel utgångspunkt. Med endast mindre ändringar kan koden också upptäcka språk som visas i mitt svar här .




  1. Beställa icke-engelska bokstäver i MySQL

  2. mysql efter insert trigger som uppdaterar en annan tabells kolumn

  3. Vad är det bästa sättet att implementera en meddelandekötabell i mysql

  4. Hur man laddar och hanterar data i Microsoft Power BI