Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Menggunakan sql/plsql, bagaimana Anda mengetahui set karakter mana yang digunakan teks?

Perangkat Pengembangan Globalisasi Oracle dapat mendeteksi kumpulan karakter.

SDK disertakan dengan Oracle tetapi tidak diinstal dalam database secara default. Untuk memuat file .jar ke dalam database, temukan direktori jlib di Oraclehome dan jalankan perintah sistem operasi ini:

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

Beberapa hak ekstra Java diperlukan, bahkan jika pengguna Anda memiliki DBA. Jalankan perintah ini lalu sambungkan kembali:

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

Buat kelas Java untuk melakukan deteksi. Di bawah ini adalah contoh yang sangat sederhana yang mengembalikan tebakan terbaik untuk sebuah string:

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

Bungkus kelas Java dalam fungsi 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';
/

Saya mensimulasikan rangkaian karakter yang berbeda dengan menerjemahkan string ke dalam bahasa yang berbeda, menyimpan teks sebagai penyandian yang berbeda dengan editor teks, membuka file dengan hex editor, dan mengubah hex menjadi 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

Contoh sepele itu berfungsi dengan baik tetapi saya tidak tahu seberapa baik itu akan bekerja dengan file dunia nyata. Ada banyak fitur di SDK, kode di atas hanyalah titik awal yang sederhana. Dengan hanya sedikit perubahan, kode juga dapat mendeteksi bahasa seperti yang ditunjukkan dalam jawaban saya di sini .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ResultSet.next sangat lambat hanya ketika kueri berisi pembatasan FIRST_ROWS atau ROWNUM

  2. koneksi jarak jauh sqlplus memberikan ORA-21561

  3. Sintaks Gabung Luar Oracle Gaya Lama - Mengapa menempatkan tanda (+) di sisi kanan tanda sama dengan di Gabung Luar Kiri?

  4. Abaikan parameter rentang tanggal di klausa where saat parameter tidak dimasukkan

  5. Panggil Fungsi Java dari fungsi Oracle