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 R113A
– R113G
.
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.