sql >> Databáze >  >> RDS >> Oracle

Jak pomocí sql/plsql zjistíte, kterou znakovou sadu text používá?

Oracle Globalization Development Kit dokáže detekovat znakové sady.

GDK je součástí Oracle, ale ve výchozím nastavení není nainstalován v databázi. Chcete-li načíst soubory .jar do databáze, vyhledejte adresář jlib na domovské stránce Oracle a spusťte tento příkaz operačního systému:

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 

Jsou potřeba některá další oprávnění Java, i když má váš uživatel DBA. Spusťte tento příkaz a poté se znovu připojte:

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

Pro provedení detekce vytvořte třídu Java. Níže je uveden velmi jednoduchý příklad, který vrací nejlepší odhad pro řetězec:

vytvořit nebo nahradit a zkompilovat zdroj java s názvem "Character_Set_Detector"asimport oracle.i18n.lcsd.*;import java.sql.*;import java.io.IOException;veřejná třída Character_Set_Detector{ public static String detect(Blob some_blob) vyvolá SQLException, IOException { LCSDector detector =new LCSDector(); detector.detect(some_blob.getBinaryStream()); LCSDResultSet detect_results =detector.getResult(); return detektor_results.getORACharakterSet(); }}/ 

Zabalte třídu Java do funkce PL/SQL:

--Zabalte třídu Java do funkce PL/SQL:vytvoření nebo nahrazení funkce detect_character_set(some_blob blob)return varchar2as jazyk javaname 'Character_Set_Detector.detect(java.sql.Blob) return java.lang.String';/ 

Simuloval jsem různé znakové sady přeložením řetězce do různých jazyků, uložením textu jako různá kódování pomocí textového editoru, otevřením souboru pomocí hex editoru a převedením hexu na BLOB:

-UTF8-Rychlá hnědá liška skočí přes Lazy DogSelect 1 ID, detect_character_set (hextoraw ('54686520717569636b2062726F776e20666f78206a756666612220666266666120269666661220669666666122662266666122062206666122220666622066666502222066122066220665016666666. El zorro marrón rápido salta sobre el perro perezososelect 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 Hundselect 4 id, detect_character_set(hextoraw('446572207363686e656c6c6520627261756e6520467563687320737072696e677420fc6265722064656e206661756c656e2048756e64')) from dual union all--Cyrillic (KOI8 -R)--Быстрая коричневая лиса прыгает через ленивую собакуselect 5 id, detect_characte r_set(hextoraw('e2d9d3d4d2c1d120cbcfd2c9decec5d7c1d120ccc9d3c120d0d2d9c7c1c5d420dec5d2c5da20ccc5cec9d7d5c020d3cfc2c1cbd5')) from dual;ID CHARACTER_SET-- -------------1 US7ASCII2 WE8ISO8859P13 ZHS16CGB2312804 WE8ISO8859P15 CL8KOI8R

Tento triviální příklad funguje dobře, ale nevím, jak dobře bude fungovat se soubory v reálném světě. V GDK je mnoho funkcí, výše uvedený kód je pouze jednoduchým výchozím bodem. Pouze s malými změnami dokáže kód detekovat i jazyky, jak je ukázáno v mé odpovědi zde .




  1. Zobrazit všechny výsledky v postgresql?

  2. Rekurzivní odstranění CakePHP

  3. Co je to za formát?

  4. postgres fulltextové vyhledávání jako operátor