How to make PDO run SET NAMES utf8 each time I connect, In ZendFramework

82,319

Solution 1

Itay,

A very good question. Fortunately for you the answer is very simple:

database.params.driver_options.1002 = "SET NAMES utf8"

1002 is the value of constant PDO::MYSQL_ATTR_INIT_COMMAND

You can't use the constant in the config.ini

Solution 2

fear my google-fu

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

first hit ;)

Solution 3

just put this in your config

database.params.charset = "utf8"

or after ZF 1.11 this would work to resources.db.params.charset = utf8 that is it

Solution 4

The connection in zend_db is lazy which means it connects on the first query. if you have a static page with no query's in it it will never even connect - even if it is initialized in you bootstrap file.

so running:

$db->query("SET NAMES 'utf8'");

Is not so smart. Big thanks to dcaunt for his solution.

Solution 5

All this methods shoud work, except in some special circumstances. For example, if you are running a web server locally on a windows machine with php < 5.3.1, only a 'manual' $db->query("SET NAMES 'utf8'"); before your actual query will work. Any other method trying to use MYSQL_ATTR_INIT_COMMAND will fail.

Here's what I learnt today, struggling with this very problem :

  1. You can't refer to PDO::MYSQL_ATTR_INIT_COMMAND in some environments (i.e. mine, specifically I don't know). You have to explicitely use 1002 instead

  2. With Zend Framework 1.11 ( perhaps since 1.8, to be confirmed ), you don't need to set database.params.driver_options.1002 = "SET NAMES utf8" in your config.ini : resources.db.params.charset = "utf8" will be enough for Zend_Db_Adapter_Pdo_Mysql to do it for you.

  3. On windows, you need php >= 5.3.1 for MYSQL_ATTR_INIT_COMMAND to work.

  4. If you replace your php version with 5.3.1 or higher (I also tested 5.3.3), you need to make sure you set a value to pdo_mysql.default_socket in your php.ini. The default empty value won't work (to be confirmed : I read something about this but didn't bother to try without it after finding out about point 5)

  5. You also need to make sure you have '127.0.0.1 localhost' in your windows\system32\drivers\etc\hosts hidden system file (that wasn't a problem for php 5.3.0)

With all this in mind, you should be able to save from yourself a day of googling and keep some of your hairs! ;)

Share:
82,319
Itay Moav -Malimovka
Author by

Itay Moav -Malimovka

SOreadytohelp Below are some of the open source projects I work on. A PHP Library the wrappes SurveyMonkey's API https://github.com/itay-moav/TheKofClient A tool to Schema Check, manage Stored Procedures, Triggers, Views and get autocompletion: https://github.com/itay-moav/rahl_commander A fun way to point users at the right direction in your site ;-) https://github.com/itay-moav/babahandofgod An old version of WMD which I converted to Mootools, 8 years ago... http://moowmd.awardspace.info Feel free to contact me through linkedin http://www.linkedin.com/in/itaymoav

Updated on April 26, 2020

Comments

  • Itay Moav -Malimovka
    Itay Moav -Malimovka about 4 years

    How to make PDO adapter run SET NAMES utf8 each time I connect, In ZendFramework. I am using an INI file to save the adapter config data. what entries should I add there?

    If it wasn't clear, I am looking for the correct syntax to do it in the config.ini file of my project and not in php code, as I regard this part of the configuration code.

  • Itay Moav -Malimovka
    Itay Moav -Malimovka about 15 years
    :-) My google foo is better, found this before posting, should have sayed so. I will refine my question, I am trying to do it in the config.ini and not in php code.
  • David Snabel-Caunt
    David Snabel-Caunt over 14 years
    This is now the best way to do it :)
  • Kzqai
    Kzqai over 11 years
    What is up with the slash escaping in that constant?
  • dminer
    dminer about 10 years
    Yes, the question asks how to set utf8. But I think you should consider using utf8mb4 to support the full utf8 character sets if you are using mysql. If you use utf8, then you can lose data depending on how your mysql is configured.
  • UserX
    UserX almost 10 years
    Thanks SchizoDuckie, I was looking for a solution for my strange chars problem, and your solution work perfectly!
  • Yasen
    Yasen about 8 years
    Google results lead to stackoverflow :)