Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sử dụng sql / plsql, làm cách nào để bạn biết được bộ ký tự nào mà văn bản sử dụng?

Bộ phát triển toàn cầu hóa Oracle có thể phát hiện các bộ ký tự.

GDK được bao gồm trong Oracle nhưng nó không được cài đặt trong cơ sở dữ liệu theo mặc định. Để tải các tệp .jar vào cơ sở dữ liệu, hãy tìm thư mục jlib trong Oraclehome và chạy lệnh hệ điều hành này:

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

Một số đặc quyền bổ sung của Java là cần thiết, ngay cả khi người dùng của bạn có DBA. Chạy lệnh này và sau đó kết nối lại:

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

Tạo một lớp Java để thực hiện việc phát hiện. Dưới đây là một ví dụ rất đơn giản trả về phỏng đoán tốt nhất cho một chuỗi:

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

Gói lớp Java trong một hàm 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';
/

Tôi đã mô phỏng các bộ ký tự khác nhau bằng cách dịch một chuỗi sang các ngôn ngữ khác nhau, lưu văn bản dưới dạng các mã hóa khác nhau bằng trình chỉnh sửa văn bản, mở tệp bằng trình chỉnh sửa hex và chuyển đổi hex thành 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

Ví dụ tầm thường đó hoạt động tốt nhưng tôi không biết nó sẽ hoạt động tốt như thế nào với các tệp trong thế giới thực. Có rất nhiều tính năng trong GDK, đoạn mã trên chỉ là một điểm khởi đầu đơn giản. Chỉ với những thay đổi nhỏ, mã cũng có thể phát hiện các ngôn ngữ như được trình bày trong câu trả lời của tôi tại đây .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tải lên hình ảnh dưới dạng BLOB trong Oracle bằng PHP

  2. % ROWTYPE biến từ tên bảng

  3. Truy vấn SQL để Đếm () nhiều bảng

  4. Phân vùng và Dấu nước Cao trong Oracle

  5. Làm cách nào để thay đổi văn bản nhãn của nút nhấn và thêm chức năng mới trong thời gian chạy? Biểu mẫu Oracle