Topic: 'ą' = 'A' ir 'ą' LIKE 'ą'

Sveiki,

reikalinga tokia situacija, kad užklausos
SELECT 'ą' = 'A' rezultatas būtų FALSE
o tuo tarpu
SELECT 'ą' LIKE 'ą' rezultatas būtų TRUE

Kitaip sakant, reikia, kad didžiosios ir mažosios raidės būtų laikomos vienodais simboliais (pvz. A = a; ą = ą), bet A (be nosinės) ir ą (su nosine) toje pačioje situacijoje būtų laikoma skirtingais simboliais. Ar taip įmanoma kaip nors "standartiškai" padaryti, be kokių nors apėjimų?


SELECT 'ą' LIKE 'ą' COLLATE  utf8_lithuanian_ci         lyg ir tiktų, bet tinka, nes  rezultatas "1", bet
SELECT 'ą' = 'A' COLLATE  utf8_lithuanian_ci         taip pat "1". O man svarbu, kad SELECT'inant "ą" negaučiau rezultatų "A"

SELECT 'ą' LIKE 'ą' COLLATE utf8_bin   rezultatas "0". Vadinasi vėl netinka.

SELECT 'ą' LIKE 'ą' COLLATE utf8_unicode_ci  lyg ir vėl tiktų, bet
SELECT 'ą' = 'A' COLLATE   utf8_unicode_ci kaip ir pirmu atveju, paprasta A ir nosinė SELECT'e laiko vienu simboliu.

O gal bandymai kaitalioti COLLATE neturi prasmės? Koduotė UTF-8.


Ačiū.

Re: 'ą' = 'A' ir 'ą' LIKE 'ą'

Viena iš konkrečių situacijų, kur toks dalykas man tampa svarbus:

Turim lentelę:

CREATE TABLE `test` (
  `text` varchar(255) collate utf8_lithuanian_ci NOT NULL,
  UNIQUE KEY `text` (`text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci;

Reikia, kad būtų galima įterpti eilutes:
ąsotis
Asotis
ąsotis
Asis
Ašis

O pastaruosius įterpus, nebeleistų įterpti šitų:
ąsotis
asotis
aSis
ašis

Pateikus užklausą (esant duomenims: Asotis, ąsotis, As, Aš) :

SELECT * FROM `test` WHERE `text` LIKE 'ą%'

rezultatas turi būti tik "ąsotis" (su ą nosine)

O analogiškai:

SELECT * FROM `test` WHERE `text` LIKE 'A%' ORDER BY `text` ASC

Reiktų rezultato:
Asis
Asotis
Ašis


žinoma, vietoje text galima naudoti papildomą stulpelį (su visom mažosiomis raidėmis), kuris ir būtų tas unikalus raktas su COLLATE=utf8_bin, bet negi nėra paprastesnio būdo?

Re: 'ą' = 'A' ir 'ą' LIKE 'ą'

Na su UTF8 man ir nepavyko gauti norimo rezultato, gali būti, kad mysql'e yra net klaida, nes realiai utf8_lithuanian_ci turėtų tai leisti.
Bet pavyko su CP1257:

SELECT _cp1257 'ą' = _cp1257 'A' COLLATE cp1257_lithuanian_ci

Rezultatas: 0

SELECT _cp1257 'ą' = _cp1257 'ą' COLLATE  cp1257_lithuanian_ci

Rezultatas: 1

SELECT _cp1257 'ą' LIKE _cp1257 'A' COLLATE cp1257_lithuanian_ci

Rezultatas: 0

SELECT _cp1257 'ą' LIKE _cp1257 'ą' COLLATE  cp1257_lithuanian_ci

Rezultatas: 1

Re: 'ą' = 'A' ir 'ą' LIKE 'ą'

va man ka tik ispuole panasi problema:
darausi as oder by name ASC ar panasiai ir beda ta kad kai surusiuoja tai viskas eina kiek suprantu pagal ascii lentele, o vat lietuviska abecele kiek kitaip issidesciusi...
nes tarkim zodziai kurie prasideda š raide nukeliauja i virsu arba i apacia, o ne i viduri kaip kad turetu buti...
gal kazkaip imanoma "customizuoti" ta ORDER?

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: 'ą' = 'A' ir 'ą' LIKE 'ą'

Jeigu duomenims saugoti naudoji koduotę, kuri atskiria lietuviškus simbolius (utf8, cp1257), tai prie stulpelio gali nurodyti lygiuotę (COLLATION) arba ją nurodyti pačioje užklausoje (kaip buvo rašyta aukščiau).

Rekomenduočiau 'utf8' koduotę it 'utf8_lithuanian_ci' lygiuotę. Jeigu svarbu didžiosios-mažosios raidės tada 'utf8_lithuanian_cs'.

Naudojimas:

SELECT stulpelis
FROM lentele
ORDER BY stulpelis COLLATE utf8_lithuanian_ci

(plačiau: http://dev.mysql.com/doc/refman/5.0/en/ … late.html)

Re: 'ą' = 'A' ir 'ą' LIKE 'ą'

minde wrote:

Na su UTF8 man ir nepavyko gauti norimo rezultato, gali būti, kad mysql'e yra net klaida, nes realiai utf8_lithuanian_ci turėtų tai leisti.
Bet pavyko su CP1257:

Dėkui už greitą atsakymą, bet, deja, ir šitas nelabai tiks, nes

SELECT _cp1257 'ąžuolas' = _cp1257 'žąuolas' COLLATE cp1257_lithuanian_ci

Gražina 1

Ir gaunasi taip, kad su UTF8 variantais neskiria ą nuo A, bet skiria pvz. ž nuo Z, o CP1257 variantas, skiria ą nuo A, bet tada nebeskiria net ą didžiosios nuo ž mažosios... Dėl klaidos MySQLe - visko gali būti, nes kiek teko prieš tai ieškoti sprendimo, tai regis ir su lenkų simboliais buvo identiškų problemų, bet spendimo, kaip ir šiu atveju, ne...

Vadinasi, kaip ir minėjau anksčiau, pasidarysiu kur reikia, po vieną papildomą stulpelį su uft8_bin ir sumažintomis raidėmis ir bus problema apeita (na ir išspręsta, nes veiks taip kaip reikia). O kad tai pridės kokį papildomą 1MB ir teks perrašyti dalį PHP kodo - nieko tokio...

Re: 'ą' = 'A' ir 'ą' LIKE 'ą'

pas mane pasirodo truko set names 'utf8';
o cia ka sis reikalas nurodo, kad duomenys tarp php ir mysql butu tokia koduote perduodama?

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: 'ą' = 'A' ir 'ą' LIKE 'ą'

zygis wrote:

pas mane pasirodo truko set names 'utf8';
o cia ka sis reikalas nurodo, kad duomenys tarp php ir mysql butu tokia koduote perduodama?

Taip.


Warning: count(): Parameter must be an array or an object that implements Countable in /home/pasokime/domains/mysql.lt/public_html/forumas/include/parser.php on line 820

Re: 'ą' = 'A' ir 'ą' LIKE 'ą'

gal šitas padės: http://forge.mysql.com/w/images/b/b7/Ho … lation.pdf, ebt tik tik tuo atveju, jeigu turi nuosavą serverį.