PHP Doctrine - Лучшая практика для установки таблицы символов по умолчанию для всего приложения - PullRequest
3 голосов
/ 23 сентября 2010

В данный момент я задаю свой набор символов и сопоставление таблиц следующим образом:

class Model extends Doctrine_Record
{

  public function setTableDefinition()
  {
    //...

    $this->option('collate', 'utf8_unicode_ci');
    $this->option('charset', 'utf8');
  }

}

Я задаю это во всех определениях моей таблицы.Есть ли способ установить значение по умолчанию?В моей начальной загрузке я устанавливаю другие значения по умолчанию, такие как:

Doctrine_Manager::getInstance()->setAttribute(
    Doctrine::ATTR_DEFAULT_IDENTIFIER_OPTIONS,
    array('name' => 'id', 'type' => 'integer', 'length' => 4));

Было бы хорошо, если бы был способ сделать то же самое для collate и charset.Я нашел для этого константы, но не смог найти где / если бы они когда-нибудь использовались.

Спасибо

Ответы [ 2 ]

3 голосов
/ 25 сентября 2010
Doctrine_Manager::connection('mysql://user:pass@host/schema')
    // This must be the charset of your HTTP header 
    // header('Content-Type: text/html;charset=utf-8');
    // or your HTML Head tag
    // <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    ->setCharset('UTF8')
    ;

Это все, что вам нужно (даже при использовании латинских таблиц, например, с акцентом на e, они будут сохранены правильно).

Но, честно говоря, лучше придерживаться одной и той же кодировки в вашей системе (DB, HTML), поскольку вы можете потерять некоторые данные (например, китайские символы, введенные на вашем сайте, не будут сохранены в ваших таблицах latin1)

2 голосов
/ 23 сентября 2010

Лучше не определять это по умолчанию в доктрине, поскольку оно должно быть совместимо с несколькими типами баз данных (Mysql, MSSql, SQLite, ...). Но я дам вам несколько вариантов, как вы можете сделать это без доктрины и один с доктриной:

Вариант 1:

Я обычно устанавливаю настройки по умолчанию для всего сервера базы данных в файле my.cf. Этот файл находится в /etc/mysql/my.cnf в Debian (Ubuntu) (это может отличаться, если вы используете другую ОС).

[mysqld]
default-character-set = utf8
default-character-collate = utf8_unicode_ci

После редактирования файла перезапустите сервер mysql. Это должно сработать.

Вариант 2: Когда вы создаете базу данных:

CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Вы также можете изменить свою базу данных:

ALTER DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Вариант 3: Если вы хотите изменить таблицу:

ALTER TABLE `tablename` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Вариант 4: Вы можете сделать что-то вроде этого:

public function configureDoctrine(Doctrine_Manager $manager)
{
    $manager->setCollate('utf8_unicode_ci');
    $manager->setCharset('utf8');
}
...