Hi Pavel,
>I believe you need to show us your sql query. Maybe something in it
>forces SQLite to use UTF-16 version of the function.
Ummm, I don't kno where the problem is, but _any_ simple select will do
(for me), e.g.:
An UTF-8 base...
CREATE TABLE "PaysISO" (
"Nom_Iso" CHAR(43),
"Code_Iso" CHAR(2));
/* Data "PaysISO" */
insert into "PaysISO" values('AFGHANISTAN', 'AF');
insert into "PaysISO" values('AFRIQUE DU SUD', 'ZA');
insert into "PaysISO" values('ÅLAND, ÎLES', 'AX');
insert into "PaysISO" values('ALBANIE', 'AL');
insert into "PaysISO" values('ALGÉRIE', 'DZ');
insert into "PaysISO" values('ALLEMAGNE', 'DE');
insert into "PaysISO" values('ANDORRE', 'AD');
insert into "PaysISO" values('ANGOLA', 'AO');
insert into "PaysISO" values('ANGUILLA', 'AI');
insert into "PaysISO" values('ANTARCTIQUE', 'AQ');
insert into "PaysISO" values('ANTIGUA ET BARBUDA', 'AG');
insert into "PaysISO" values('ANTILLES NÉERLANDAISES', 'AN');
insert into "PaysISO" values('ARABIE SAOUDITE', 'SA');
insert into "PaysISO" values('ARGENTINE', 'AR');
insert into "PaysISO" values('ARMÉNIE', 'AM');
insert into "PaysISO" values('ARUBA', 'AW');
insert into "PaysISO" values('AUSTRALIE', 'AU');
insert into "PaysISO" values('AUTRICHE', 'AT');
...
select * from PaysISO where Nom_ISO like '%ile%';
RecNo Nom_Iso Code_Iso
----- ------------------------------------------ --------
1 ÅLAND, ÎLES AX
2 CAÏMANES, ÎLES KY
3 CHRISTMAS, ÎLE CX
4 COCOS (KEELING), ÎLES CC
5 COOK, ÎLES CK
6 FALKLAND, ÎLES (MALVINAS) FK
7 FÉROÉ, ÎLES FO
8 GÉORGIE DU SUD ET LES ÎLES SANDWICH DU SUD GS
9 ÎLE DE MAN IM
10 ÎLES MINEURES ÉLOIGNÉES DES ÉTATS-UNIS UM
11 ÎLES VIERGES BRITANNIQUES VG
12 ÎLES VIERGES DES ÉTATS-UNIS VI
13 MARIANNES DU NORD, ÎLES MP
14 MARSHALL, ÎLES MH
15 NORFOLK, ÎLE NF
16 SALOMON, ÎLES SB
17 SVALBARD ET ÎLE JAN MAYEN SJ
18 TURKS ET CAÏQUES, ÎLES TC
This is a Unicode (non-ICU) folded, unaccented LIKE:
{"like", 2, SQLITE_UTF8, (void *)
&likeInfoNorm, likeFunc8 },
{"like", 2, SQLITE_UTF16, (void *)
&likeInfoNorm, likeFunc16 },
{"like", 3, SQLITE_UTF8, (void *)
&likeInfoNorm, likeFunc8 },
{"like", 3, SQLITE_UTF16, (void *)
&likeInfoNorm, likeFunc16 },
{"glob", 2, SQLITE_UTF8, (void *)
&globInfo, likeFunc8 },
{"glob", 2, SQLITE_UTF16, (void *)
&globInfo, likeFunc16 },
{"glob", 3, SQLITE_UTF8, (void *)
&globInfo, likeFunc8 },
{"glob", 3, SQLITE_UTF16, (void *)
&globInfo, likeFunc16 },
The same happens for GLOB with 2-arg (UTF-16 version invoked):
select * from PaysISO where Nom_ISO glob '*ILE*';
(same output).
But I just noticed that glob with 3 args invokes the UTF-8 version:
select * from PaysISO where glob('*ILE*', Nom_ISO, '{');
(same output).
While the 3-args like still calls the UTF-16 version:
select * from PaysISO where like('%ile%', Nom_ISO, '{');
(same output).
In all examples above, I've used either plain ASCII or "weirder"
accented letters, to further test my code. Also doing this way shows
that the native SQLite version is not doing anything. (When things get
strange, you start looking behind your shoulders.)
The VC++ debugger pops up each time and shows the caller is sqlite3.dll
every time, so there is no man-in-the-middle attack against my poor
extension. I have only v3.6.18 and no modified/recompiled sqlite3.dll
here.
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users