首先是简短版本:
我希望命令doctrine:database:create
使用正确/定义的字符集和排序规则来创建数据库。怎么实现呢? (在最好的情况下,不要更改服务器上的任何全局设置。)
详细版本:
上下文是Symfony 4应用程序和Doctrine 2.DBMS:MySQL,操作系统:Ubuntu 14.04。我想用Doctrine创建数据库:
$ bin/console doctrine:database:create
后台执行的SQL语句是:
CREATE DATABASE `mydb`
表示:它不会使用charset
中的collate
和.../config/packages/doctrine.yaml
设置,也会忽略DATABASE_URL
中的.../.env
。
.../config/packages/doctrine.yaml
parameters:
env(DATABASE_URL): ''
doctrine:
dbal:
# configure these for your database server
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
# With Symfony 3.3, remove the `resolve:` prefix
url: '%env(resolve:DATABASE_URL)%'
mapping_types:
enum: string
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Base/Entity'
prefix: 'App\Base\Entity'
alias: App
.../.env
###> doctrine/doctrine-bundle ###
DATABASE_URL=mysql://root:pwd@127.0.0.1:3306/mydb?charset=utf8mb4
###< doctrine/doctrine-bundle ###
数据库DEFAULT_CHARACTER_SET_NAME
然后是latin1
,而DEFAULT_COLLATION_NAME
是latin1_swedish_ci
:
SELECT
`DEFAULT_CHARACTER_SET_NAME`, `DEFAULT_COLLATION_NAME`
FROM
information_schema.SCHEMATA
WHERE
schema_name = 'mydb'
;
+----------------------------+------------------------+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| latin1 | latin1_swedish_ci |
+----------------------------+------------------------+
答案 0 :(得分:0)
这是另一个答案: Doctrine2: How to set all tables to collate with UTF8
他们建议在实体本身使用整理,但是你需要指定所有这样的entites,如果你有很多这样的,那就是一个问题
@ORM\Table(options={"collate"="utf8mb4_unicode_ci"})
第二种方法是使用doctrine.yml
doctrine:
dbal:
options:
1002: "SET NAMES 'utf8mb4_unicode_ci'"
第三个解决方案是编辑mysql配置文件并在那里添加默认字符集。
<强>的my.cnf 强>
[mysqld]
character-set-server=utf8mb4_unicode_ci
collation-server=utf8mb4_unicode_ci
MySQL GLOBAL VARIABLES (对于当前会话)
SET GLOBAL `character_set_server` = 'utf8mb4';
SET GLOBAL `collation_server` = 'utf8mb4_unicode_ci';