Autor Zpráva
Igor
Profil *
Prosím o radu , mám problém se zobrazením otazníků místo znaků ěčř.
Hlavička stránky

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Po připojení vyberu db a pak provadim ruzne pokusy s nastavenim stranek. Zkusil jsem už snad vsechno podle rad ve clanku od p Vrany

třida mysql
    $this->connection = mysql_connect(
              $config->mysql->server->name,
              $config->mysql->server->user,
              $config->mysql->server->psw
              );
    if (!$this->connection) die('Couldnot connect: ' . mysql_error());
    $result = mysql_select_db($this->c->mysql->db->name, $this->connection);
    if (!$result) die('<b>Chyba:</b> Nepovedlo se vybrat databázi '.$this->c->mysql->db->name);
    $this->setMysqlCharset("utf8");


$this->setMysqlCharset("utf8");
Ty prikazy jsem zkousel v ruznem poradi a nic nezabralo
  public function setMysqlCharset($charset){
    $charset = strtolower($charset);
    $charset = strtr ( $charset, array('-'=>'',' '=>'') );
    $charset=($charset=="windows1250")?"cp1250":"utf8";
    $charset = (isset($charset) AND $charset<>"")? $charset : "utf8"; // SET NAMES meni i collation_connection na defaultni hodnotu pro nastavovany character_set
//    $r = mysql_query ("SET NAMES '$charset'");
  $r = mysql_query("ALTER DATABASE `pozice` DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;");
  $r = mysql_query("SET CHARACTER SET $charset"); // musí se nastavit až po výběru databáze
  $r = mysql_query("SET COLLATION_CONNECTION='utf8_czech_ci';"); 
  if (!$r) echo mysql_error($r);
//  mysql_query("SET CHARACTER SET utf8");
//  mysql_query("SET NAMES utf8");
Joker
Profil
Igor:
Nějak mi není jasné proč se vlastně nepoužívá to SET NAMES, stejně jako mi není jasné proč to mění i výchozí kódování databáze.

Jinak ta metoda je vtipná, i když si domyslím, že to bude nastavovat $charset a ne natvrdo UTF-8.
Třeba $this->setMysqlCharset("latin1") nastaví UTF-8, $this->setMysqlCharset("windows-1250") nastaví cp1250, ale vůbec nejvtipnější je, že $this->setMysqlCharset("cp1250") nastaví UTF-8.
Igor
Profil *
Joker:
Ano je vtipná, protože je rozkopaná. Natvrdo jsem to nastavil protože jsem zkopíroval kód ze stránke p. Vrány, podle kterého kde to mělo zaručeně jet
Adrifinel
Profil
Hm.. já mám všechyn databáze rovnou nastavené na: utf8_czech_ci
Igor
Profil
Haleluja, problém vyřešen!

Dělal jsem chybu v tom, že jsem kromě ALTER DATABASE použil i to character set samostatně:

  $r = mysql_query("ALTER DATABASE `pozice` DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;");
  // tento příkaz by změnil to co nastavilo COLLATE ...
  //  $r = mysql_query("SET CHARACTER SET utf8"); // musí se nastavit až po výběru databáze


Takže vlastně, jak je tabulka jednou nastavená, tak už CHARACTER SET nenastavuji, to by rozkopalo to kódování tabulky, které již bylo správně nastaveno.
Igor
Profil
Tak mě napadá, nemělo by se to řešení v příspěvku #5 přidat do vlákna "Některé častěji řešené dotazy pro MySQL - FAQ"?

Podle tohoto zdroje:
23.8.2005 23:28:04 a další svědčí o tom, že nejsem první ani poslední, kterým
mysql_query("set names utf8");

ani
mysql_set_charset("utf8"); 

nezabral. NAvíc proč to volat při každém spuštění, když db mohu nastavit jednou pro vždy jako UTF-8...
Davex
Profil
Igor:
Tak mě napadá, nemělo by se to řešení v příspěvku #5 přidat do ...FAQ
Asi jsem nepochopil v čem je podstata tvého řešení. O SET CHARACTER SET utf8 se FAQ nezmiňuje.

nejsem první ani poslední, kterým mysql_query("set names utf8"); ani mysql_set_charset("utf8"); nezabral
Nebylo to tím, že byly zakomentované?

NAvíc proč to volat při každém spuštění, když db mohu nastavit jednou pro vždy jako UTF-8...
Protože to není spolehlivé. Databáze a tabulky by měly mít nastavené výchozí kódování utf8 a mělo by se používat SET NAMES utf8 po připojení k databázi.

Nemělo by být potřeba:
$r = mysql_query("SET CHARACTER SET $charset"); // musí se nastavit až po výběru databáze 
  $r = mysql_query("SET COLLATION_CONNECTION='utf8_czech_ci';");
Igor
Profil
Davex:
„nejsem první ani poslední, kterým mysql_query("set names utf8"); ani mysql_set_charset("utf8"); nezabral“
Nebylo to tím, že byly zakomentované?

Ne. Tyhle příkazy byly první, které jsem zkoušel a zakomentoval jsem je proto, že nepomáhaly. První jsem zkoušel SET NAMES. Mimoto jsem se řídil i tím článkem pana Vrány a komentáři pod ním, takže jsem vyčerpal snad všechny možnosti a ten příkaz na ALTER DATABASE ... COLLATE jediný zabral. A pak ten příkaz SET CHARAKTER SET utf8 mi zase rozhodil kódování (to collate), tak jsem to zakomentoval a jede to.

SET COLLATION_CONNECTION to byl jen pokus z nouze. Pak jsem použil to
mysql_query("ALTER DATABASE `pozice` DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;"); no a od té doby tam nic nemám a jede mi to.

No a když teď na zkoušku zkusím ten SET NAMES utf8, tak mi to rozhodí kódování těch textů již uložených. Poté, když texty vymažu, vložím znova tak jsou opět zobrazeny správně. Jde mi však o to, že kdybych nejdříve neprovedl ALTER DATABASE ... COLLATE... tak by mi to stejně nejelo.

Nejsem expert, takže do toho tolik nevidím, abych mohl říct, čím to je, jen vím co mi zabralo a co ne.
Davex
Profil
Igor:
že kdybych nejdříve neprovedl ALTER DATABASE ... COLLATE... tak by mi to stejně nejelo.
Pokud není výchozí kódování databáze utf8, tak se při vytvoření tabulek použije výchozí kódování latin1 z konfigurace MySQL, které není pro češtinu vhodné.

Přijde mi samozřejmé, že musí mít databáze a tabulky nastaveno pro češtinu vhodné kódování před vkládáním dat. Ve FAQ by mohlo být něco v tomto smyslu, že je důležité při vytvoření databáze nastavit správné kódování.

CREATE DATABASE `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci
Igor
Profil
Davex:
Přijde mi samozřejmé, že musí mít databáze a tabulky nastaveno pro češtinu vhodné kódování před vkládáním dat. Ve FAQ by mohlo být něco v tomto smyslu, že je důležité při vytvoření databáze nastavit správné kódování.
>
1
>
CREATE DATABASE `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci

Vidíš, a to jsem nevěděl.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0