Autor Téma: SQLite využitie LIKE a Collation  (Přečteno 1905 krát)

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
SQLite využitie LIKE a Collation
« kdy: 14-03-2018, 13:57:04 »
Prosím pozrieť obrázok výsledkov.
Ako zariadiť aby LIKE vracalo v treťom stĺpci vždy 1, resp. TRUE ? Ide o medzinárodné znaky, nielen slovenčinu.

Kód: MySQL [Vybrat]
  1. DROP TABLE      if exists myTbl;
  2. CREATE TABLE    myTbl ( txt1 NVARCHAR( 10 ) COLLATE UTF16NoCase );
  3. INSERT INTO     myTbl ( txt1 ) VALUES ( 'áčko' ),( 'ÁČKO' );

Kód: MySQL [Vybrat]
  1. SELECT          a.txt1, b.txt1,
  2.                 a.Txt1 LIKE b.Txt1
  3. FROM            myTbl a, myTbl b
  4. ORDER BY        a.Txt1 COLLATE UTF16NoCase
Použil som custom collation takto:
Kód: Delphi [Vybrat]
  1.   With SQLiteCollation do
  2.     begin
  3.     Active          := False;    
  4.     CollationKind   := scCustomUTF16;
  5.     DriverLink      := SQLitePhysDriverLink;
  6.     CollationName   := 'UTF16NoCase';
  7.     Flags           := [sfIgnoreCase];
  8. //    OnCompare    := myOnCollationEvent;
  9.     end;
  10.   Conn.Connected         := True;
  11.   SQLiteCollation.Active := True;
  12.  

Mám aj oncollation udalosť:
Kód: Delphi [Vybrat]
  1. Procedure TForm1.myOnCollationEvent(ASender: TObject; len1: Integer; str1: Pointer; len2: Integer; str2: Pointer; var AResult: Integer);
  2. var
  3.   s1, s2: String;
  4. begin
  5.   SetString( s1, PChar( str1 ), len1 div 2 );
  6.   SetString( s2, PChar( str2 ), len2 div 2 );
  7.   AResult :=  compareText( s1, s2, loUserLocale );
  8. end;
Ale vyriešiť sa mi to nepodarilo.
Nemáte s týmto skúsenosti prosím?
« Poslední změna: 14-03-2018, 14:05:23 od Miroslav Baláž »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3897
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:SQLite využitie LIKE a Collation
« Odpověď #1 kdy: 14-03-2018, 14:57:41 »
Dať to tam natvrdo. Len či to tak chceš
Kód: SQL [Vybrat]
  1. SELECT          a.txt1, b.txt1,
  2.                 1
  3. FROM            myTbl a, myTbl b
  4. ORDER BY        a.Txt1 COLLATE UTF16NoCase
  5.  
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite využitie LIKE a Collation
« Odpověď #2 kdy: 14-03-2018, 15:05:57 »
Myslel som to tak, že engina "ÁČKO" a "áčko" vyhodnotí formou case insensitive.
Tým pádom sú tie slová zhodné. Samozrejme inokedy by sa vyskytli slová, ktoré zhodné nie sú.
1-notka nemôže byť natvrdo. Ide o obecné riešenie problému.
Sú dve veci:
  • sortovanie, či zoradenie
  • vyhodnotenie v rámci porovnávania (napr. WHERE)
Poznámka: vo svojom základnom príspevku som zmätočne označil onCompare event ako onCollation. Malo byť on compare, ale technicky to mám OK. Už to nemôžem opraviť.
« Poslední změna: 14-03-2018, 15:08:43 od Miroslav Baláž »

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 612
  • Karma: 40
    • Verze Delphi: 10.3
Re:SQLite využitie LIKE a Collation
« Odpověď #3 kdy: 14-03-2018, 16:51:23 »
Použít funkci Upper? Nepoužívám SQLite, tak jen nástřel:
SELECT
 a.txt1,
 b.txt1,
 CASE WHEN Upper(a.Txt1)=Upper(b.Txt1) THEN 1 ELSE 0 END as Shoda
FROM myTbl a, myTbl b
ORDER BY a.Txt1 COLLATE UTF16NoCase

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite využitie LIKE a Collation
« Odpověď #4 kdy: 14-03-2018, 18:19:49 »
Skúsil som využiť UPPER a zobraziť, takto
Kód: MySQL [Vybrat]
  1. SELECT          a.txt1, Upper(a.Txt1)
  2. FROM            myTbl a
  3. ORDER BY        a.Txt1 COLLATE UTF16NoCase
Výsledok ma nepotešil:
z "áčko" sa vo funkcii Upper stalo "áčKO"
takže dôvod na vytvorenie UDF funkcie, napr UCASE
Medzitým som narazil pri LIKE na toto:
http://www.sqlite.org/lang_expr.html
The LIKE operator is case sensitive by default for unicode characters that are beyond the ASCII range. For example, the expression 'a' LIKE 'A' is TRUE but 'æ' LIKE 'Æ' is FALSE
« Poslední změna: 14-03-2018, 18:35:17 od Miroslav Baláž »

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 612
  • Karma: 40
    • Verze Delphi: 10.3
Re:SQLite využitie LIKE a Collation
« Odpověď #5 kdy: 14-03-2018, 18:31:30 »
Hm, upper asi umí jen ASCII znaky :-(
https://www.w3resource.com/sqlite/core-functions-upper.php

Nejdou tam používat uživatelem definované funkce? Pak by se dala vyrobit nějaká vlastní funkce, která by převedla na velká písmena i znaky s diakritikou.

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite využitie LIKE a Collation
« Odpověď #6 kdy: 14-03-2018, 18:36:43 »
Áno UDF idú, upravil som svoj príspevok vyššie.
Bohužiaľ aj LIKE je case insensitive iba pre ASCII

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 612
  • Karma: 40
    • Verze Delphi: 10.3
Re:SQLite využitie LIKE a Collation
« Odpověď #7 kdy: 14-03-2018, 18:39:02 »
Jestli jdou UDF, tak tedy udělat UDF MyUpper, která bude umět převádět i znaky s diakritikou, a pak:

SELECT
 a.txt1,
 b.txt1,
 CASE WHEN MyUpper(a.Txt1)=MyUpper(b.Txt1) THEN 1 ELSE 0 END as Shoda
FROM myTbl a, myTbl b
ORDER BY a.Txt1 COLLATE UTF16NoCase

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite využitie LIKE a Collation
« Odpověď #8 kdy: 14-03-2018, 18:48:39 »
Áno UDF idú. Dá sa to vyriešiť. Nejak som sa spoliehal na FireDAC, ale ten zrejme zvláda len zoradenie podľa abecedy cez collate UTF16NoCase
« Poslední změna: 14-03-2018, 18:51:13 od Miroslav Baláž »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2426
  • Karma: 130
    • Verze Delphi: D2007, XE3, DX10
Re:SQLite využitie LIKE a Collation
« Odpověď #9 kdy: 14-03-2018, 19:03:27 »
Nejdou tam používat uživatelem definované funkce?
Nevim jak ve spojeni s FireDac, ale SQLite per se ma funkci  sqlite3_create_collation a soucasti definice je comparer http://www.sqlite.org/c3ref/create_collation.html.

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite využitie LIKE a Collation
« Odpověď #10 kdy: 14-03-2018, 19:40:29 »
V troch zdrojakoch firedac su tie funkcie zmienene,
Ich efekt sa mi vsak nepodarilo realne objavit inde, nez pri sortovani.
Az budem mat trochu viac casu, skusim debugovat, kade bezi kod pri tom sortovani, snad nejake suvislosti najdem.
Dik.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2426
  • Karma: 130
    • Verze Delphi: D2007, XE3, DX10
Re:SQLite využitie LIKE a Collation
« Odpověď #11 kdy: 14-03-2018, 19:49:35 »
Ich efekt sa mi vsak nepodarilo realne objavit inde, nez pri sortovani.
Aaaa, mas pravdu, to je jen pro trideni. Pro case insensitive porovnani si budes muset udelat nejakou svoji UPPER/LOWER UDF funkci. Sorry za sum.

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite využitie LIKE a Collation
« Odpověď #12 kdy: 14-03-2018, 20:16:42 »
Pre SQLite existuje nejake UCI extension: "International Components for Unicode" library
https://www.sqlite.org/src/artifact?ci=trunk&filename=ext/icu/README.txt
Riesi aj LIKE vo verzii case insensitive : "Unicode Aware LIKE Operator"
Lenze nevidim nikde jeho napojenie cez fireDAC a inou cestou sa netrufam pustat, trvalo by to neprimerane dlho.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1614
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite využitie LIKE a Collation
« Odpověď #13 kdy: 15-03-2018, 09:08:35 »
Pre SQLite existuje nejake UCI extension: "International Components for Unicode" library
https://www.sqlite.org/src/artifact?ci=trunk&filename=ext/icu/README.txt
Riesi aj LIKE vo verzii case insensitive : "Unicode Aware LIKE Operator"
Lenze nevidim nikde jeho napojenie cez fireDAC a inou cestou sa netrufam pustat, trvalo by to neprimerane dlho.

S ICU mas dve moznosti. Bud zbuildujes SQLite s flagem SQLITE_ENABLE_ICU s tim ze ICU bude soucasti knihovny, nebo jej nahrajes jako extension. Pokud bys mel zajem, muzu Ti popsat jak, ale posli to prosim jako separatni dotaz.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: