Thread View: pl.comp.lang.delphi.bazy-danych
2 messages
2 total messages
Started by J-23
Sun, 18 May 2014 14:51
UTF8 Wielkość pola VARCHAR Firebird
Author: J-23
Date: Sun, 18 May 2014 14:51
Date: Sun, 18 May 2014 14:51
42 lines
2677 bytes
2677 bytes
Witam, Rzecz którą opisze ma miejsce przy pisaniu projektu w javie ale dotyczy kodowania w UTF8 w bazie firebird. rzecz całą opisałem w tym wątku: http://tracker.firebirdsql.org/browse/JDBC-355 Krótko nakreślę ile bajtów zakodowanych w UTF8 zajmie zakładając maksymalną wielkość pola zadeklarowanego jako VARCHAR(6) z tego co wyczytałem na stronie IBExpert (strona jest podana w tym wątku do którego podałem link) silnik firebirda wypadku pola VARCHAR jego wielkość podaną mnoży przez 4 co sprawdziłem zapytaniem na tabeli opisanej w wątku pod linkiem (jest tam cała struktura tabeli) co daję według tego 24 bajty. Dobrze zrozumiałem? select b.rdb$field_name as field, c.rdb$field_length as length, a.rdb$relation_name as table_name from rdb$relations a inner join rdb$relation_fields b on a.rdb$relation_name = b.rdb$relation_name inner join rdb$fields c on b.rdb$field_source = c.rdb$field_name where a.rdb$system_flag = 0 and a.rdb$relation_name='OSOBY' and b.rdb$field_name='KOD' Pytam bo mam problem z zapytaniem: SELECT * FROM (SELECT id_osoby, imie, nazwisko, adres, kod, miasto, telefon ,email, COALESCE(przedstawiciel,0) AS przedstawiciel, COALESCE(wlasciciel,0) AS wlasciciel, COALESCE(ekspert,0) AS ekspert, COALESCE(dystrybutor,0) AS dystrybutor, uwagi FROM osoby ) WHERE imie LIKE '%TestA%' OR nazwisko LIKE '%TestA%' OR adres LIKE '%TestA%' OR kod LIKE '%TestA%' OR miasto LIKE '%TestA%' OR telefon LIKE '%TestA%' Pomińmy proszę aspekt wydajności całość się rozchodzi o pole KOD autor JDBC twierdzi że przy frazie %TestA% (7 bajtów) jest ono za duże w stosunku do pola kod które jest zadeklarowane jako VARCHAR(6) ale skoro jak już wspomniałem jest ono mnożone przez 4 wiec maksymalna fraza może być 24 bajty, dobrze rozumiem? Pozdrawiam
Re: UTF8 Wielkość pola VARCHAR Firebird
Author: Arivald
Date: Sun, 18 May 2014 16:26
Date: Sun, 18 May 2014 16:26
61 lines
3643 bytes
3643 bytes
On 2014-05-18 16:51, J-23 wrote: > Witam, > Rzecz którą opisze ma miejsce przy pisaniu projektu w javie ale dotyczy > kodowania w UTF8 w bazie firebird. > > rzecz całą opisałem w tym wątku: > http://tracker.firebirdsql.org/browse/JDBC-355 > > Krótko nakreślę ile bajtów zakodowanych w UTF8 zajmie zakładając > maksymalną wielkość pola zadeklarowanego jako VARCHAR(6) z tego co > wyczytałem na stronie IBExpert (strona jest podana w tym wątku do > którego podałem link) silnik firebirda wypadku pola VARCHAR jego > wielkość podaną mnoży przez 4 co sprawdziłem zapytaniem na tabeli > opisanej w wątku pod linkiem (jest tam cała struktura tabeli) co daję > według tego 24 bajty. Dobrze zrozumiałem? > > select > b.rdb$field_name as field, > c.rdb$field_length as length, > a.rdb$relation_name as table_name > from rdb$relations a > inner join rdb$relation_fields b on a.rdb$relation_name = > b.rdb$relation_name > inner join rdb$fields c on b.rdb$field_source = c.rdb$field_name > where a.rdb$system_flag = 0 and a.rdb$relation_name='OSOBY' and > b.rdb$field_name='KOD' > > Pytam bo mam problem z zapytaniem: SELECT * FROM (SELECT id_osoby, imie, > nazwisko, adres, kod, miasto, telefon ,email, COALESCE(przedstawiciel,0) > AS przedstawiciel, COALESCE(wlasciciel,0) AS wlasciciel, > COALESCE(ekspert,0) AS ekspert, COALESCE(dystrybutor,0) AS dystrybutor, > uwagi FROM osoby ) WHERE imie LIKE '%TestA%' OR nazwisko LIKE '%TestA%' > OR adres LIKE '%TestA%' OR kod LIKE '%TestA%' OR miasto LIKE '%TestA%' > OR telefon LIKE '%TestA%' > > Pomińmy proszę aspekt wydajności > > całość się rozchodzi o pole KOD autor JDBC twierdzi że przy frazie > %TestA% (7 bajtów) jest ono za duże w stosunku do pola kod które jest > zadeklarowane jako VARCHAR(6) ale skoro jak już wspomniałem jest ono > mnożone przez 4 wiec maksymalna fraza może być 24 bajty, dobrze rozumiem? > > Pozdrawiam > Dla UTF-8 to jest maksymalnie x4, ale dla języków europejskich przeciętnie x1,2. Tym niemniej program zakłada maksymalny bufor. Problem w tyk kto i gdzie potrzebuje tych bajtów. Czy to wymóg protokołu FB? Czy może jedynie komponentów po stronie Delphi? A co do '%TestA%' i wielkości pola.... przecież to nie ma znaczenia. '%TestA%' to część SQLa, a nie danych. W każdym bądź razie jest to wielka wada FB czy komponentów do niego, że mieszają bajty ze znakami. Już dziesięć lat temu to było passe, a dzisiaj to po prostu nie do pomyślenia. To nie powinno mieć miejsca, dla pola varchar(6) dataset powinien przyjmować 6 znaków. -- Arivald
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads