Ako nastavit database charset na latin1
- Stic
- Člen | 28
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
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)
- petr.pavel
- Člen | 535
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
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
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
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
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;
}