Zielony Smok - logo witryny

Apache Derby: atrybuty sortowania tekstów

collation=sposób_sortowania

collation = sortowanie zlokalizowane

Baza Derby domyślnie używa sortowania UTF-8, jednak poprzez ustawienie atrybutów collation i territory można to zmienić. Oba atrybuty mogą zostać ustawione jedynie w momencie utworzenia bazy danych.

Sortowanie zlokalizowane ustawione atrybutami odnosi się wyłącznie do tabel utworzonych przez użytkownika – nie zmienia sortowania tabel systemowych.

Sortowanie zlokalizowane jest ważne przy wyszukiwaniu i porównywaniu danych.

Atrybut collation może przyjmować następujące argumenty:

  • UCS_BASIC – sortowanie domyślne UTF-8
  • TERRITORY_BASED – sortowanie zgodne z językiem wyspecyfikowanym w atrybucie 'territory’. Jeśli atrybut 'territory’ nie jest podany uwzględniana jest domyślna lokalizacja, np. ta, która byłaby zwrócona przy użyciu metody Locale.getDefault(). Zawsze używa się z określoną siłą sortowania:
    • TERRITORY_BASED:PRIMARY – znaki takie jak ‘A’, a, ą, ă, á – nie są od siebie odróżniane, ogonki, daszki, akcenty, etc. nie są uwzględniane w sortowaniu, a więc pomieszane
    • TERRITORY_BASED:SECONDARY – odróżniane są ogonki, daszki, akcenty i ustawiane jak w narodowym słowniku – jest to szczególnie ważne np. w języku hiszpańskim, gdzie pojedyncze głoski ‘ch’ i ‘ll’ są zapisywane dwiema literami. Nie jest rozróżniana wielkość liter
    • TERRITORY_BASED:TERTIARY – domyślne – w sortowaniu odróżniane są oba poprzednie oraz wielkość liter
    • TERRITORY_BASED:IDENTICAL – uwzględniane są wszelkie różnice

Przykład

jdbc:derby:baza_danych;create=true;territory=pl_PL;collation=TERRITORY_BASED:TERTIARY

territory=”pl_PL”

Służy do podania lokalizacji innej niż domyślna. Kraj podaje się w sytemie „pl_PL”, gdzie pierwsze dwie litery oznaczają język, pozostałe dwie – kraj. Kody są określone przez standard ISO-639 i ISO-3166.

Atrybut może być użyty wyłącznie przy tworzeniu nowej bazy danych.

Przykład

jdbc:derby:baza_danych;create=true;territory=pl_PL

Przykłady

Przykłady w klasach R113AR113G.

Klasa wzorcowa R113A.java

W kolejnych klasach zmienia się tylko jedna linijka.

package aderby.attributes.collation;

import aderby.DerbyUtil;

import java.sql.*;

public class R113A {
    private static final String baza = "C:/Przyklady/r113A";
    private static final String skrypt = "aderby/src/resources/sqls/teksty.sql";

    public static void main(String[] args) {
        DerbyUtil.startDerbyEngine(DerbyUtil.embdriver);
        Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true");
        DerbyUtil.jdbcRunScript(skrypt, con);
        Statement stat = null;
        ResultSet rs = null;
        try {
            stat = con.createStatement();
            rs = stat.executeQuery("SELECT * FROM dictionary ");
            while (rs.next()) {
                System.out.print(rs.getString("polski") + " ");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DerbyUtil.close(rs);
        DerbyUtil.close(stat);
        DerbyUtil.close(con);
        DerbyUtil.shutdownEmbeddedDB(baza);
        DerbyUtil.shutdownDerbyEngine();
    }
}
Plik teksty.sql
CREATE TABLE dictionary(                 
            polski VARCHAR (30)
);
CREATE INDEX i_polish ON dictionary (polski ASC);
INSERT INTO dictionary VALUES ('E');
INSERT INTO dictionary VALUES ('e');
INSERT INTO dictionary VALUES ('O');
INSERT INTO dictionary VALUES ('o');
INSERT INTO dictionary VALUES ('L');
INSERT INTO dictionary VALUES ('l');
INSERT INTO dictionary VALUES ('S');
INSERT INTO dictionary VALUES ('s');
INSERT INTO dictionary VALUES ('A');
INSERT INTO dictionary VALUES ('a');
INSERT INTO dictionary VALUES ('Ą');
INSERT INTO dictionary VALUES ('ą');
INSERT INTO dictionary VALUES ('Ę');
INSERT INTO dictionary VALUES ('ę');
INSERT INTO dictionary VALUES ('Ó');
INSERT INTO dictionary VALUES ('ó');
INSERT INTO dictionary VALUES ('Ł');
INSERT INTO dictionary VALUES ('ł');
INSERT INTO dictionary VALUES ('ń');
INSERT INTO dictionary VALUES ('Ń');
INSERT INTO dictionary VALUES ('Ś');
INSERT INTO dictionary VALUES ('ś');
INSERT INTO dictionary VALUES ('C');
INSERT INTO dictionary VALUES ('Ć');
INSERT INTO dictionary VALUES ('ć');
INSERT INTO dictionary VALUES ('c');
INSERT INTO dictionary VALUES ('n');
INSERT INTO dictionary VALUES ('N');
INSERT INTO dictionary VALUES ('Z');
INSERT INTO dictionary VALUES ('Ż');
INSERT INTO dictionary VALUES ('ź');
INSERT INTO dictionary VALUES ('Ź');
INSERT INTO dictionary VALUES ('z');
INSERT INTO dictionary VALUES ('ż');

R113A.java

Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true");

A C E L N O S Z a c e l n o s z Ó ó Ą ą Ć ć Ę ę Ł ł Ń ń Ś ś Ź ź Ż ż

R113B.java

Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true;territory=pl_PL");

A C E L N O S Z a c e l n o s z Ó ó Ą ą Ć ć Ę ę Ł ł Ń ń Ś ś Ź ź Ż ż

R113C.java

Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true;territory=pl_PL;collation=UCS_BASIC");

A C E L N O S Z a c e l n o s z Ó ó Ą ą Ć ć Ę ę Ł ł Ń ń Ś ś Ź ź Ż ż

R113D.java

Connection con = DerbyUtil.connectEmbeddedDB(baza, "create=true;territory=pl_PL;collation=TERRITORY_BASED");

a A ą Ą c C ć Ć e E ę Ę l L ł Ł n N ń Ń o O ó Ó s S ś Ś z Z ź Ź ż Ż

R113E.java

Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true;territory=pl_PL;collation=TERRITORY_BASED:PRIMARY");

A a Ą ą C c Ć ć E e Ę ę L l Ł ł n N ń Ń O o Ó ó S s Ś ś Z z ź Ź Ż ż

R113F.java

Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true;territory=pl_PL;collation=TERRITORY_BASED:SECONDARY");

A a Ą ą C c Ć ć E e Ę ę L l Ł ł n N ń Ń O o Ó ó S s Ś ś Z z ź Ź Ż ż

R113G.java

Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true;territory=pl_PL;collation=TERRITORY_BASED:TERTIARY");

a A ą Ą c C ć Ć e E ę Ę l L ł Ł n N ń Ń o O ó Ó s S ś Ś z Z ź Ź ż Ż

Uwagi

Gdy używamy serwera bazy danych plik bazy danych jest umieszczany w folderze projektu, na tym samym poziomie zagnieżdżenia co moduły projektu, ale czasami nie jest bezpośrednio widoczny. Np. w IntelliJ IDEA trzeba zajrzeć do plików na dysku i usunąć bazę danych ręcznie. Oczywiście do usunięcia możesz użyć odpowiedniej metody, która była prezentowana w niektórych z wcześniejszych przykładów.

Więcej o zlokalizowanym sortowaniu tekstów: Własne sortowanie tekstu (CollatorProvider),

Pliki do ściągnięcia

Aktualny (tworzony narastająco) plik module-info.java

Aktualny (tworzony narastająco) plik DerbyUtil.java

Pliki tworzone narastająco zastępują poprzednie pliki o tej samej nazwie i działają dla wszystkich wcześniej opublikowanych przykładów we wszystkich wpisach w projekcie. W przypadku pliku module-info.java może być potrzebne skreślenie niepotrzebnych wpisów.