Autor Zpráva
Kubicek
Profil *
Ahoj, potřebuji si předat pro výpis z db proměnnou pomocí get, ale nechce se mi vytvářet v tabulce db název jak s diakritikou tak bez diakritiky. Chci se proto zeptat, mám se bát použití diakritiky v proměnné v adrese nebo to musím řešit jinak, například pomocí id což se mi v daném případě vůbec nehodí?
imploder
Profil
Kubicek
Používat diakritiku přímo v URL není možné, je potřeba obsah zakódovat funkcí urlencode(). Při odesílání formuláře to prohlížeč udělá automaticky, jinde (třeba v odkazu) je nutné to ošetřit.
Kubicek
Profil *
To je výborné, takže url zak´dovaná touto funkcí se dá rovnout porovnávat s db?
imploder
Profil
Kubicek
Hodnota zakódovaná tou funkcí do URL se ve skriptu na dané URL objeví už rozkódovaná, tj. jako by byla napsaná i s diakritikou přímo ve skriptu. Takže by s tím neměl být problém. Jinak pokud se něco tou funkcí zakóduje a nepošle se to přes GET nebo POST (u těch to PHP samo rozkóduje), tak se to dá rozkódovat do původní podoby funkcí urldecode().
BetaCam
Profil
Kubicek

No hlavně takovéhle posílání "diakritiky" přes url je prasárna. To už by snad bylo vtipnější nastavit sloupec v DB třeba na porovnání utf8_unicode_ci a do url to dávat bez diakritiky i když to mi taky nepřijde jako úplně nejčistší způsob, ale aspoň to navenek vypadá čistě.
imploder
Profil
BetaCam
Nevypadá to úplně hezky čitelně, ale obsah formuláře se tak posílá běžně. Na POST zase nejde odkazovat. Nějak se to poslat musí. Když dám něco do URL bez diakritiky tak mi to tu diakritiku nevykouzlí. Nechápu, jak s tím souvisí kódování databáze. Měl jsem za to, že v PHP se po připojení nastaví kódování komunikace s databází (SET CHARACTER SET - musí se shodovat s kódováním souboru) a dál se o to nemusím starat. Aspoň teda u mysql to tak funguje.
BetaCam
Profil
imploder
Když dám něco do URL bez diakritiky tak mi to tu diakritiku nevykouzlí.

No ono jí to sice nevykouzlí, ale může jí to "ignorovat".

Schválně si to vyzkoušej. :) Příklad :

do db si dej tabulku :
CREATE TABLE `test` (
  `dia` text collate utf8_czech_ci NOT NULL,
  `nodia` text character set utf8 collate utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

INSERT INTO `test` (`dia`, `nodia`) VALUES
('ěščřžýáíéťďľ', 'ěščřžýáíéťďľ');


A teď posílej na DB dotazy :
SELECT * FROM `test` WHERE dia = 'ěščřžýáíéťďľ'

SELECT * FROM `test` WHERE nodia = 'ěščřžýáíéťďľ'

SELECT * FROM `test` WHERE dia = 'ešcřzýáiéťďl

SELECT * FROM `test` WHERE nodia = 'ešcřzýáiéťďl


1. dotaz řádek najde
2. dotaz řádek najde
3. dotaz nevrátí nic
4. dotaz řádek najde


To samé nastane pokud je v DB něco bez diakritiky a já pošlu dotaz s diakritikou. Tedy v databázy je například string "kocka" do dotazu dáš WHERE neco = 'kočka' a řádek se ti vrátí jako kdyby si napsal WHERE neco = 'kocka'
imploder
Profil
BetaCam
Funguje to. I to diakritiku odstraní a najde písmena bez ní. Prostě ignorance :)

Nezdá se mi to jako nejlepší řešení. V češtině je docela dost slov, co se liší jenom diakritikou, a program by je měl pokud možno rozlišovat. Lepší by bylo:
1. hledat shodu s diakritikou a tu vypsat jako první
2. až pak případně diakritiku odstranit (postará se o to PHP skript, strtr()) a porovnávat řetězce bez ní
Nevím ale, jak by se to hledání bez diakritiky vysvětlilo sql serveru, když v tabulce je to s diakritikou a collate u té tabulky být nastavené nemůže, protože to by pak zase diakritiku ignorovalo (a nefungoval by bod 1). Leda že by se dalo nastavit collate zvlášť jenom pro ten select.
Tak nevím, snad to nějak jde. Prostě ignorovat diakritiku je takové humpolácké, to by to dělat nemělo.
BetaCam
Profil
imploder
Prostě ignorovat diakritiku je takové humpolácké, to by to dělat nemělo.

No to záleží situace od situace. Například při hledání je to v podstatě nutnost. :)
imploder
Profil
BetaCam
No to záleží situace od situace. Například při hledání je to v podstatě nutnost. :)
Právě při hledání je nutnost diakritiku rozlišovat. Když hledám SLEĎ, tak nechci, aby mi to vyhodilo SLED. Žádný vyhledávač tohle nedělá. Samozřejmě můžu hledat bez diakritiky a najít tak i stejné slovo s diakritikou, ale shoda včetně diakritiky by měla mít přednost před shodou bez ohledu na diakritiku.
BetaCam
Profil
imploder
1. hledat shodu s diakritikou a tu vypsat jako první

No to v podstatě neni problém.

2. až pak případně diakritiku odstranit

No to taky neni problém a nemusim tu diakritiku ani odstraňovat

postará se o to PHP skript, strtr()

To ani neni nutné.

Nevím ale, jak by se to hledání bez diakritiky vysvětlilo sql serveru, když v tabulce je to s diakritikou a collate u té tabulky být nastavené nemůže, protože to by pak zase diakritiku ignorovalo (a nefungoval by bod 1). Leda že by se dalo nastavit collate zvlášť jenom pro ten select.

Takže zase příklad :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
<head>
	<title>New document</title>
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>

<?php
mysql_connect('server', 'user', 'pass');
mysql_select_db('database');
mysql_query("SET NAMES 'utf8'");
$result = mysql_query("SELECT * FROM `test` WHERE dia = 'ěščřžýáíéťďľ'");
$row = mysql_fetch_array($result);
echo $row['dia'].'<br />';

$result = mysql_query("SELECT * FROM `test` WHERE dia = 'ěsčržýáíéťďľ' COLLATE 'utf8_unicode_ci'");
$row = mysql_fetch_array($result);
echo $row['dia'].'<br />';
?>

</body>
</html>


S diakritikou

$result = mysql_query("SELECT * FROM `test` WHERE dia = 'ěščřžýáíéťďľ'");


a bez ní :
$result = mysql_query("SELECT * FROM `test` WHERE dia = 'ěsčržýáíéťďľ' COLLATE 'utf8_unicode_ci'");


Jak si to seřadíš ve výsledku je už jedno
imploder
Profil
BetaCam
Dík, takový příklad jsem ani nepotřeboval, hlavní je, že collate je možné určit i jednotlivě pro každý select. Tak to potom jo.

Česká verze utf8 je potřeba taky na správné řazení podle české abecedy, v PhpMyAdminu je na to políčko "Porovnávání".
BetaCam
Profil
imploder
Česká verze utf8 je potřeba taky na správné řazení podle české abecedy, v PhpMyAdminu je na to políčko "Porovnávání".

Políčko porovnávání je právě collation

Dík, takový příklad jsem ani nepotřeboval,

Vždy radši uvádím příklad, aby když někdo něco podobného bude v budoucnu hledat aby viděl přímé použití.

hlavní je, že collate je možné určit i jednotlivě pro každý select.

No to není tak úplně přesné. COLLATE můžeš použít klidně i vícekrát v jednom SQL dotazu.


SELECT a, b FROM `tabulka` ORDER BY a COLLATE 'utf8_unicode_ci' ASC, b COLLATE 'utf8_czech_ci' ASC


Toto je zápis který je naprosto v pořádku. COLLATE můžeš přiřadit k různým věcem ať už stringům či sloupcům. Proto není problém porovnávat třeba podle 'utf8_unicode_ci', ale výsledky řadit podle 'utf8_czech_ci'

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: