Ako nastavit database charset na latin1

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Stic
Člen | 28
+
0
-

Zdravim, mam taku blbu otazocku, ale snazim sa uz den riesit to preco mi skript vracia zle enkodovanie z databazy…

Musim bohuzial pracovat s databazou v ktorej su starsie data s latin1 enkodovanim.

Pre jednoduchost som si overil v com je problem a skusil si jednoduchy vypis z databazy pomocou

$database = new Connection($dsn, $user, $password , array("charset" => "latin1"));


foreach ($database->table('articles')->order('pub_date DESC')->limit(5) as $article)
{
    echo $article->title . "<br />";
}

a vsetko fungovalo ako ma, enkodovanie je v poriadku.

Ale ked pracujem v ukazkovej sandbox aplikacii a v config.neon nastavim :

common:
	parameters:
		database:
			driver: mysql
			socket: /Applications/MAMP/tmp/mysql/mysql.sock
			dbname: news_site
			user:
			password:
			charset: latin1

	php:
		date.timezone: Europe/Prague
		# zlib.output_compression: yes

	nette:
		application:
			errorPresenter: Error

		database:
			dsn: '%database.driver%:unix_socket=%database.socket%;dbname=%database.dbname%'
			user: %database.user%
			password: %database.password%
			charset: %database.charset%

Tak sa mi vzdy vracia le vypis so zlym enkodovanim…
V com moze byt problem?

Editoval Stic (26. 10. 2012 8:52)

Ot@s
Backer | 476
+
0
-

Prubni charset přesunout do options.

		database:
			dsn: '%database.driver%:unix_socket=%database.socket%;dbname=%database.dbname%'
			user: %database.user%
			password: %database.password%
			options:
				- charset: %database.charset%

EDIT: doplněna pomlčka před charset

Editoval Ot@s (26. 10. 2012 9:53)

Stic
Člen | 28
+
0
-

to vypisuje ze „constant(): Couldn't find constant charset“ :)

Ot@s
Backer | 476
+
0
-

Stic napsal(a):

to vypisuje ze „constant(): Couldn't find constant charset“ :)

Uf, zapomněl jsem pomlčku před charset…

petr.pavel
Člen | 535
+
0
-

V dokumentaci k PDO/connection píšou, že charset je od verze PHP 5.3.6 součástí DSN:

database:
    dsn: '%database.driver%:unix_socket=%database.socket%;dbname=%database.dbname%;charset=%database.charset'
    user: %database.user%
    password: %database.password%

Pro starší verze je tam pak příklad, který hrubě převedeno do Neonu znamená:

database:
    dsn: '%database.driver%:unix_socket=%database.socket%;dbname=%database.dbname%'
    user: %database.user%
    password: %database.password%
    options:
        - PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES %database.charset%'

Nemyslím ale, že by v Neonu šlo takhle používat konstanty. Takže si to budeš muset přebrat :-)

Ot@s
Backer | 476
+
0
-

petr.pavel napsal(a):

V dokumentaci k PDO/connection píšou, že charset je od verze PHP 5.3.6 součástí DSN:

To je záležitost PDO, resp. takto bych neuvažoval. Nette to implementuje univerzálně. Z direktivy nette.database se vyrobí objekt Nette\Database\Connection a ten má jako 4-tý parametr options. Pro MySqlDriver se pak nette.database.options.charset „převede“ na SQL SET NAMES ….

Stic
Člen | 28
+
0
-

kazdopadne, zatial nic nefungovalo :)

Stic
Člen | 28
+
0
-

uz si vazne neviem rady, podla http://ne-on.org/ by mali byt database: options definovane v config neon takto:

database:
			dsn: '%database.driver%:unix_socket=%database.socket%;dbname=%database.dbname%'
			user: %database.user%
			password: %database.password%
			options:
				{charset: latin1}

kedze options maju byt predane ako array, co aj skutocne funguje ked to napisem bez neonu…

kazdopadne ked to nastavim, tak mi vyhodi chybu constant(): Couldn't find constant charset a vo vypise v error logu vidim ze:

database => array(1) ▼ {
     default => array(4) ▼ {
        dsn => "mysql:unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock;dbname=news_site" (74)
        user => "" (4)
        password => "" (4)
        options => array(1) { ... }
     }
  }

@peter.pavel – skusal som ci to funguje tak ako si pisal, ale nie, musi to byt v options…

petr.pavel
Člen | 535
+
0
-

Přímo do DSN jsi to teda zkoušel a nefungovalo to, jo? (staré PHP)

Koukni do temp/cache/_Nette.Configurator na createServiceNette__database__default(), co předává konstuktoru Connection. Třeba experimentováním vykoukáš, jak to má být v configu správně.

Stic
Člen | 28
+
0
-

no nasiel som docasne riesenie, pretoze v config.neon som vyskusal kadeco, ale nic nefungovalo…

docasne riesenie bolo v repository.php nastavit SET NAMES (cez config.neon ho akosi nebralo do uvahy)

abstract class Repository extends Nette\Object
{
	protected $connection;

	public function __construct(Nette\Database\Connection $db)
	{
		$db->exec('SET NAMES latin1');
		$this->connection = $db;
	}