abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 04:11 | Komunita

    V Berlíně probíhá konference vývojářů a uživatelů desktopového prostředí KDE Plasma Akademy 2025. Při té příležitosti byla oznámena alfa verze nové linuxové distribuce KDE Linux.

    Ladislav Hagara | Komentářů: 0
    6.9. 17:11 | Nová verze

    Byl vydán Debian 13.1, tj. první opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.12, tj. dvanáctá opravná verze Debianu 12 s kódovým názvem Bookworm. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.

    Ladislav Hagara | Komentářů: 2
    5.9. 23:44 | IT novinky

    Evropská komise potrestala Google ze skupiny Alphabet pokutou 2,95 miliardy eur (71,9 miliardy Kč) za porušení antimonopolní legislativy. Podle EK, která mimo jiné plní funkci antimonopolního orgánu EU, se Google dopustil protisoutěžních praktik ve svém reklamním byznysu. Google v reakci uvedl, že rozhodnutí považuje za chybné a hodlá se proti němu odvolat. EK ve věci rozhodovala na základě stížnosti Evropské rady vydavatelů. Podle

    … více »
    Ladislav Hagara | Komentářů: 20
    5.9. 23:11 | Komunita

    Podpora 32bitového Firefoxu pro Linux skončí v roce 2026. Poslední podporované 32bitové verze budou Firefox 144 a Firefox 140 s rozšířenou podporou, jehož podpora skončí v září 2026.

    Ladislav Hagara | Komentářů: 3
    5.9. 19:33 | IT novinky

    Společnost Raspberry Pi nově nabízí Raspberry Pi SSD s kapacitou 1 TB za 70 dolarů.

    Ladislav Hagara | Komentářů: 7
    5.9. 15:55 | Zajímavý software

    Microsoft BASIC pro mikroprocesor 6502 byl uvolněn jako open source. Zdrojový kód je k dispozici na GitHubu.

    Ladislav Hagara | Komentářů: 9
    5.9. 15:33 | IT novinky

    Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) se připojil k dokumentu „A Shared Vision of Software Bill of Materials (SBOM) for Cybersecurity“, který vydala americká Agentura pro kybernetickou a infrastrukturní bezpečnost (CISA) s Národní bezpečnostní agenturou (NSA), spolu s dalšími mezinárodními partnery. Dokument vznikl v rámci globálního expertního fóra pro SBOM, které má za cíl motivovat k širšímu využívání … více »

    Ladislav Hagara | Komentářů: 3
    4.9. 21:22 | IT novinky

    Švýcarská AI centra EPFL, ETH Zurich a CSCS představila otevřený vícejazyčný velký jazykový model (LLM) s názvem Apertus. Vyzkoušet lze na stránce Public AI Inference Utility.

    Ladislav Hagara | Komentářů: 28
    4.9. 17:22 | Nová verze

    Byl vydán Linux Mint 22.2 s kódovým jménem Zara. Podrobnosti v přehledu novinek a poznámkách k vydání. Vypíchnout lze novou XApp aplikaci Fingwit pro autentizaci pomocí otisků prstů nebo vlastní fork knihovny libAdwaita s názvem libAdapta podporující grafická témata. Linux Mint 22.2 bude podporován do roku 2029.

    Ladislav Hagara | Komentářů: 2
    4.9. 12:55 | IT novinky

    Čínská společnost Tencent uvolnila svůj AI model HunyuanWorld-Voyager pro generování videí 3D světů z jednoho obrázku a určené trajektorie kamery. Licence ale nedovoluje jeho používání na území Evropské unie, Spojeného království a Jižní Koreje.

    Ladislav Hagara | Komentářů: 1
    Pro otevření více webových stránek ve webovém prohlížečí používám
     (83%)
     (7%)
     (2%)
     (3%)
     (3%)
     (2%)
    Celkem 152 hlasů
     Komentářů: 11, poslední 4.9. 16:12
    Rozcestník

    Administrace komentářů

    Jste na stránce určené pro řešení chyb a problémů týkajících se diskusí a komentářů. Můžete zde našim administrátorům reportovat špatně zařazenou či duplicitní diskusi, vulgární či osočující příspěvek a podobně. Děkujeme vám za vaši pomoc, více očí více vidí, společně můžeme udržet vysokou kvalitu AbcLinuxu.cz.

    Příspěvek
    31.8.2008 20:14 default | skóre: 22 | Madrid
    Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
    OKi, tak začneme.

    Požadavky

    • ukládání dat ve více jazycích
    • řazení těchto dat podle zvyklostí daného locale
    • jednoduchost pro databázi i aplikační server
    Začnu tím třetím, tedy jednoduchostí. Vrchol jednoduchosti vídím v Oracle:
    CREATE TABLE loc_test (
        lt_text NVARCHAR2(64))
    /
    
    INSERT INTO loc_test (lt_text) VALUES ('Petr')
    /
    INSERT INTO loc_test (lt_text) VALUES ('František')
    /
    INSERT INTO loc_test (lt_text) VALUES ('Áron')
    /
    INSERT INTO loc_test (lt_text) VALUES ('Antonín')
    /
    INSERT INTO loc_test (lt_text) VALUES ('Petříček')
    /
    
    COMMIT
    /
    
    ALTER SESSION SET NLS_SORT = CZECH_AI
    /
    
    SELECT
        lt_text
    FROM
        loc_test
    ORDER BY
        lt_text
    /
    
    ALTER SESSION SET NLS_SORT = ASCII7
    /
    
    SELECT
        lt_text
    FROM
        loc_test
    ORDER BY
        lt_text
    /
    
    SELECT
        lt_text
    FROM
        loc_test
    ORDER BY
        NLSSORT(lt_text, 'NLS_SORT = CZECH_AI')
    /
    
    DROP TABLE loc_test
    /
    
    Použití je velmi jednoduché. Ve výsledku je vidět, že to skutečně funguje tak, jak chceme:
    CREATE TABLE succeeded.
    1 rows inserted
    1 rows inserted
    1 rows inserted
    1 rows inserted
    1 rows inserted
    COMMIT succeeded.
    ALTER SESSION SET succeeded.
    LT_TEXT                                                          
    ---------------------------------------------------------------- 
    Antonín                                                          
    Áron                                                             
    František                                                        
    Petr                                                             
    Petříček                                                         
    
    5 rows selected
    
    ALTER SESSION SET succeeded.
    LT_TEXT                                                          
    ---------------------------------------------------------------- 
    Antonín                                                          
    František                                                        
    Petříček                                                         
    Petr                                                             
    Áron                                                             
    
    5 rows selected
    
    LT_TEXT                                                          
    ---------------------------------------------------------------- 
    Antonín                                                          
    Áron                                                             
    František                                                        
    Petr                                                             
    Petříček                                                         
    
    5 rows selected
    
    DROP TABLE loc_test succeeded.
    
    Tak! A jak něco podobného udělat například v PostgreSQL? PostgreSQL umožňuje nastavit locale při vytváření databáze. Což je docela slabé. Proto jsem došel k následujícímu řešení, které je optimalizované na maximální výkon pro SELECT (to byl požadavek) a jednoduchost volání jako v Oracle.

    Základní schéma

    Na začátku je tabulka LOCALES, která funguje jako číselník podporovaných locales. Jednotlivá locale se zadávají v Javí notaci, tedy JAZYK_ZEMĚ_VARIANTA. Pak tam jsou naimplementované funkce, které umějí dohledat locale stejně tak, jak to dělá Java (java.util.ResourceBundle). Další tabulkou je tabulka TABLES, která ukládá názvy tabulek, které jsou pod lokalizací. Všechny funkce, které nějak mohou afektovat data (například přidání locale, odebrání locale), díky této tabulce automaticky přidávají nové jazyky. Úplně vespod jsou funkce pro podporu uživatelských proměnných v session, implementace chybějících funkcí PL/PgSQL a tak.

    Data pod lokalizací

    Základem jsou tři tabulky. Tabulka se suffixem _C, která ukládá nelokalizované atributy, další se suffixem _L, která ukládá lokalizovaná data a poslední se suffixem _D, která drží stav NULL, NOT NULL pro lokalizovaná data. Příklad:
    CREATE TABLE i18n.example_c (
            exmp_id bigint DEFAULT nextval('sq_exmp_id') NOT NULL,
            exmp_type bigint NOT NULL,
            exmp_creation_time timestamp with time zone NOT NULL DEFAULT NOW()
    );
    
    ALTER TABLE i18n.example_c ADD CONSTRAINT pk_exmp_id PRIMARY KEY (exmp_id);
    
    
    CREATE TABLE i18n.example_l (
            exmp_entity bigint NOT NULL,
            exmp_locale bigint NOT NULL,
            exmp_name varchar NULL,
            exmp_value varchar NULL,
            exmp_value_ord bytea NULL
    );
    
    ALTER TABLE i18n.example_l ADD CONSTRAINT pk_exmp_entity_exmp_locale PRIMARY KEY (exmp_entity, exmp_locale);
    ALTER TABLE i18n.example_l ADD CONSTRAINT fk_exmp_entity_exmp_id FOREIGN KEY (exmp_entity) REFERENCES i18n.example_c (exmp_id) ON DELETE CASCADE;
    ALTER TABLE i18n.example_l ADD CONSTRAINT fk_exmp_locale_locale_id FOREIGN KEY (exmp_locale) REFERENCES i18n.locale (id);
    
    
    CREATE TABLE i18n.example_d (
            column_name varchar NOT NULL,
            nullable boolean NOT NULL
    );
    
    ALTER TABLE i18n.example_d ADD CONSTRAINT pk_example_d PRIMARY KEY (column_name);
    
    Pak si nadefinuješ pohledy, které celou tuto strukturu zobrazí jako jednu tabulku:
    CREATE VIEW i18n.example AS
    SELECT
                    c.exmp_id,
                    c.exmp_type,
                    c.exmp_creation_time,
                    l.exmp_locale,
                    l.exmp_name,
                    l.exmp_value,
                    l.exmp_value_ord
            FROM
                    example_c c INNER JOIN example_l l ON (c.exmp_id = l.exmp_entity)
            WHERE
                    l.exmp_locale = i18n.get_session_locale_id();
    
    
    CREATE VIEW i18n.example_a AS
    SELECT
                    c.exmp_id,
                    c.exmp_type,
                    c.exmp_creation_time,
                    l.exmp_locale,
                    l.exmp_name,
                    l.exmp_value,
                    l.exmp_value_ord
            FROM
                    example_c c INNER JOIN example_l l ON (c.exmp_id = l.exmp_entity);
    
    Ta view se suffixem _A zobrazují veškeré locales (nejsou omezena na aktuální locale v session). Jak je vidět, pro každý řádek v tabulce EXAMPLE_C je v tabulce EXAMPLE_L vygenerován speciální řádek pro každé locale. Když přidáš další locale, "systém" automaticky do všech těchto kompozitů dogeneruje prázdné řádky.

    Řazení

    Tak, to byla struktura. Abychom mohli řadit v závislosti na locale, potřebujeme collation key. Ten spočítáme podle locale například Javou (třídy java.util.Locale a java.text.Collator). Získaný collation key uložíme do sloupku EXMP_VALUE_ORD v tabulce EXAMPLES_L a pak jen tento sloupek uvedeme v ORDER BY klauzuli. Jak jednoduché, že?

    Jen precizní je dostatečně dobré

    Nakonec napíšeme tři funkce, které pomocí RULEs zaregistrujeme jako Oraclí INSTEAD OF — TRIGGERy na ta VIEWs, které za nás automaticky při INSERTu nebo UPDATE přepočítají collation key. Ve všech dotazech tedy používáme vlastně jen ta VIEWs, protože se díky pravidlům chovají jako opravdové tabulky.


    Takže — namísto Oraclího ALTER SESSION SET NLS_SORT… zavoláš i18n.set_session_locale(…) dál používáš databázi, jak je třeba. Když potřebuješ řadit jinak, buď zavoláš set_session_locale znovu, nebo si napíšeš vlastní ORDER BY klauzuli.

    V tomto formuláři můžete formulovat svou stížnost ohledně příspěvku. Nejprve vyberte typ akce, kterou navrhujete provést s diskusí či příspěvkem. Potom do textového pole napište důvody, proč by měli admini provést vaši žádost, problém nemusí být patrný na první pohled. Odkaz na příspěvek bude přidán automaticky.

    Vaše jméno
    Váš email
    Typ požadavku
    Slovní popis
    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.