Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno MySQL - Diakritika

Zdravím,

mám PHP script, kterým do DB ukládám string. Jedná se o "český" string, kde jsou háčky a čárky. Do DB se mi místo háčků a čárek ukládají nějaké "nesmysly". Při selectu z DB na web, tak na webu vidím zase hezky pěkně "české" stringy s diakritikou. Kódování v PHP souboru mám UTF-8, DB mám utf8 + utf8_czech_ci, tabulku, a fild tabulky taky. Nevadilo by mi to, ale jde mi o to, že chci teď udělat vyhledávač, který bude vyhledávat ve všech stringách uložených v desítkách řádcích, tak mi to nebude fungovat.

Když bude uživatel hledat záznam, kde je slovo např. slovo "pařba". Tak se provede:

SELECT * FROM tabulka WHERE text LIKE '%pařba%';

Problém nastává tehdy, že v DB jsou "nesmysly" a není tam nikde slovo "pařba", protože "Ř" není uloženo. Ale pokud si to vypíšu pomocí PHP, tak na webu se mi z těch "nesmyslů" složí zase diakritika.

Nějaké návrhy na řešení ? Děkuji.

Předmět Autor Datum
- Ono, znaky, carky hacky(specialni znaky) se moc nedoporucuji pouzivat,,,,
CoCoChanel 28.11.2013 18:52
CoCoChanel
Pokud ukládáš články do DB a potom je z ní vypisuješ na WEB, tak se MySQL hodí. Snad existuje nějaké…
Bayerus 28.11.2013 18:56
Bayerus
to platilo za krále klacka. Je i soubor php ve správném k´odování UTF8?
mnua.al 28.11.2013 21:16
mnua.al
Na základe čoho si určil, že sa ti do databázy ukladajú nezmysly? Ten select ti nefunguje, keď ho sp…
los 28.11.2013 19:00
los
Zkusil jsem nastavit charset, ale pořád špatně. Podle čeho jsem to určil ? Podle tohoto. Do input t…
Bayerus 28.11.2013 19:12
Bayerus
daj sem script vytvorenej tabulky (create table ... ) a este sem daj prikaz akym zapisujes do DB.
wam_Spider007 28.11.2013 19:19
wam_Spider007
Create Table: CREATE TABLE `clanky` ( `id` int(255) NOT NULL AUTO_INCREMENT, `poradi` int(255) NOT…
Bayerus 28.11.2013 19:25
Bayerus
Ku CREATE TABLE: - Znakovú sadu pre stĺpec autor si chcel asi ponechať tiež na DEFAULT, t.j. vôbec j…
los 28.11.2013 19:49
los
Díky moc, už jsem problém vyřešil. To co ty vidíš v SQL Insert, jsou proměnné, které jsou inicializ…
Bayerus 28.11.2013 19:58
Bayerus
Skús sa zamyslieť, že odkiaľ sa tam zobrali tie HTML značky <p> a </p>. Tam zrejme bude tvoj problém…
los 28.11.2013 19:21
los
Ty značky jsou tam z HTML editoru online.
Bayerus 28.11.2013 19:26
Bayerus
Nielen tie značky, ale aj tie nezmysly. Tvoje možnosti sú: 1. Zistiť, či tvoj HTML editor umožňuje,…
los 28.11.2013 19:29
los
Díky moc, pomohl jsi mi. Problém byl opravdu v HTML editor.
Bayerus 28.11.2013 19:58
Bayerus
Nie je za čo. :-)
los 28.11.2013 20:01
los
Máš pravdu, všechno co jde mimo ten HTML editor, přímo z input text, tak to do DB zapisuje krásně če…
Bayerus 28.11.2013 19:29
Bayerus
to je zase jiná, věc, ale je to prasárna, data se mají ukládat ve své "přirozené formě".
mnua.al 28.11.2013 21:17
mnua.al
Môžeš byť trochu konkrétnejší? Používateľ vloží naformátovaný text v HTML formáte a do databázy sa t… poslední
los 28.11.2013 21:48
los

Zkusil jsem nastavit charset, ale pořád špatně. Podle čeho jsem to určil ? Podle tohoto.

Do input text na WEBu napíšu:

ěščřžýáíéúů zkouším diakritiku

Když se to uloží do DB, tak vidím v Navicat:

<p>ě&scaron;čřž&yacute;&aacute;&iacute;&eacute;&uacute;ůzkou&scaron;&iacute;m diakritiku</p>

A když selectnu z DB ten odstavec <p>, tak na webu vidím:

ěščřžýáíéúů zkouším diakritiku

Create Table:

CREATE TABLE `clanky` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `poradi` int(255) NOT NULL,
  `rubrika` int(255) NOT NULL,
  `nazev_clanku` text COLLATE utf8_czech_ci NOT NULL,
  `obsah_clanku` longtext COLLATE utf8_czech_ci NOT NULL,
  `autor` text CHARACTER SET latin1 NOT NULL,
  `datum_pridani` datetime NOT NULL,
  `datum_start` datetime NOT NULL,
  `datum_konec` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

Insert to table:

mysql_query("INSERT INTO clanky (rubrika, datum_pridani, datum_konec, datum_start, nazev_clanku, obsah_clanku, poradi, autor) VALUES ( '".$rubrika."', '".$datum_pridani."', '".$mysql_datum_konec."', '".$mysql_datum_start."', '".$nazev_clanku."', '".$obsah_clanku."', '".$pocet_radku."', '".$autor."');") or die ("This: " .mysql_error());         

Při vytvoření připojení s DB:

mysql_query("SET character_set_client=utf8");
mysql_query("SET character_set_connection=utf8");
mysql_query("SET character_set_results=utf8");

Ku CREATE TABLE:
- Znakovú sadu pre stĺpec autor si chcel asi ponechať tiež na DEFAULT, t.j. vôbec ju tam nemusíš definovať.
- Dátový typ stĺpca autor by nemal byť TEXT, ale skôr VARCHAR.
A drobnosti:
- Aj keď číslo v zátvorkách za INT nemá veľký význam, tak je trochu nezvyčajné používať INT(255), obvykle sa používa INT(11).
- Pre stĺpce nazev_clanku a obsah_clanku nemusíš definovať COLLATE, pretože sa použije to, čo si definoval ako DEFAULT.

Ku INSERT príkazu:
Prečítaj si niečo o SQL injection.

K nastavovaniu charsetu:
Stačí zavolať funkciu mysql_set_charset (a je to tak aj lepšie).

Nielen tie značky, ale aj tie nezmysly. Tvoje možnosti sú:
1. Zistiť, či tvoj HTML editor umožňuje, aby nenahrádzal diakritiku nezmyslami.
2. Opravovať nezmysly z toho editora na serveri.
3. Použiť iný HTML editor, ktorý neposiela nezmysly.
4. Nepoužiť žiaden HTML editor.

Tvoj problém vôbec nesúvisí s kódovaním v MySQL.

to je zase jiná, věc, ale je to prasárna, data se mají ukládat ve své "přirozené formě".

Zpět do poradny Odpovědět na původní otázku Nahoru