1

MySQL サーバー 5.5.28 を介してデータベース ORM として Propel 1.6.7 と統合された Symfony 2.1.6 フレームワークを使用していますが、データベース照合を に設定する際に問題が発生していますutf8_unicode_ci

私のapp/config/config.yml :

...
propel:
    dbal:
        driver:               %database_driver%
        user:                 %database_user%
        password:             %database_password%
        dsn:                  "%database_driver%:host=%database_host%;dbname=%database_name%;charset=%database_charset%"
        options:
            MYSQL_ATTR_INIT_COMMAND: "SET NAMES utf8 COLLATE utf8_unicode_ci"
        attributes:           {}

(パラメーターは既にapp/config/parameters.ymlで定義されています)

それがなくoptionsても機能しますが、文字セットの問題があります (MySQL はデフォルトでutf8_general_ci照合しますが、データベース スキーマは で定義されていましたutf8_unicode_ci)。options上記のように Propel/Symfonyを使用すると、一連の例外が発生します。

in /var/www/vendor/propel/propel1/runtime/lib/Propel.php at line 725  -+
at ErrorHandler ->handle ('2', 'Illegal string offset 'value'', '/var/www/vendor/propel/propel1/runtime/lib/Propel.php', '725', array('source' => array('MYSQL_ATTR_INIT_COMMAND' => 'SET NAMES utf8 COLLATE utf8_unicode_ci'), 'write_to' => array(), 'option' => 'MYSQL_ATTR_INIT_COMMAND', 'optiondata' => 'SET NAMES utf8 COLLATE utf8_unicode_ci', 'key' => '1002'))
in /var/www/vendor/propel/propel1/runtime/lib/Propel.php at line 725  -+
at Propel ::processDriverOptions (array('MYSQL_ATTR_INIT_COMMAND' => 'SET NAMES utf8 COLLATE utf8_unicode_ci'), array())
in /var/www/vendor/propel/propel1/runtime/lib/Propel.php at line 668  -+
at Propel ::initConnection (array('dsn' => 'mysql:host=127.0.0.1;dbname=symfony;charset=utf8', 'user' => 'root', 'password' => '********', 'classname' => 'DebugPDO', 'options' => array('MYSQL_ATTR_INIT_COMMAND' => 'SET NAMES utf8 COLLATE utf8_unicode_ci'), 'attributes' => array(), 'settings' => array()), 'default')
in /var/www/vendor/propel/propel1/runtime/lib/Propel.php at line 576  -+
at Propel ::getMasterConnection ('default')
in /var/www/vendor/propel/propel1/runtime/lib/Propel.php at line 602  -+
at Propel ::getSlaveConnection ('default')
in /var/www/vendor/propel/propel1/runtime/lib/Propel.php at line 552  -+
at Propel ::getConnection ('default', 'read')
in /var/www/vendor/propel/propel1/runtime/lib/query/ModelCriteria.php at line 1160  -+
at ModelCriteria ->find ()
in /var/www/src/Acme/AppBundle/Controller/DefaultController.php at line 20  -+
at DefaultController ->fooAction ()
at call_user_func_array (array(object(DefaultController), 'fooAction'), array())
in kernel.root_dir/bootstrap.php.cache at line 1426  -+
at HttpKernel ->handleRaw (object(Request), '1')
in kernel.root_dir/bootstrap.php.cache at line 1390  -+
at HttpKernel ->handle (object(Request), '1', true)
in kernel.root_dir/bootstrap.php.cache at line 1566  -+
at HttpKernel ->handle (object(Request), '1', true)
in kernel.root_dir/bootstrap.php.cache at line 617  -+
at Kernel ->handle (object(Request))
in /var/www/web/app_dev.php at line 25  -+

my.cnfを変更して、MySQL のデフォルトの照合順序をサーバー構成から直接定義できることはわかっていますが、実行時にこれを設定する必要があります...何か不足していますか? app/config/config.ymlMYSQL_ATTR_INIT_COMMANDでどのように設定すればよいですか?

4

2 に答える 2

1

ここにソースコードが表示されている場合は、

$value = $optiondata['value']; // this is line no 275
if (is_string($value) && strpos($value, '::') !== false) {
    if (!defined($value)) {
       throw new PropelException("Invalid PDO option/attribute value specified: ".$value);
    }
    $value = constant($value);
}

オプションデータに「値」キーが必要なので、これを試してください

propel:
    dbal:
        driver:               %database_driver%
        user:                 %database_user%
        password:             %database_password%
        dsn:                  "%database_driver%:host=%database_host%;dbname=%database_name%;charset=%database_charset%"
        options:
            MYSQL_ATTR_INIT_COMMAND: { value: "SET NAMES utf8 COLLATE utf8_unicode_ci" }
        attributes:           {}

または

接続が開かれた直後に実行する必要があるクエリを定義することもできます

propel:
    dbal:
        default_connection:         default
        connections:
            default:
                # ...
                options:
                    ATTR_PERSISTENT: false
                attributes:
                    ATTR_EMULATE_PREPARES: true
                settings:
                    charset:        { value: UTF8 }
                    queries:        { query: 'INSERT INTO BAR ('hey', 'there')' }

参考までに: https://github.com/propelorm/PropelBundle/blob/1.1/Resources/doc/configuration.markdown

Propel ランタイム構成ファイル

于 2013-01-24T06:08:10.620 に答える
0

my.cnf を変更するポイントについて、使用するデータベースにのみ特定の照合設定が必要な場合は、コマンド " create database db_name CHARACTER SET utf8を使用して DB を作成するときに、照合設定を上書きする方がよいと思います。COLLATE utf8_unicode_ci " my.cnf を編集してグローバルに変更する代わりに

于 2013-01-22T10:46:05.167 に答える