symfony - 使用教义:数据库:创建时,如何创建具有特定追逐和排序规则的数据库?
问题描述
先说短版:
我希望该命令doctrine:database:create
使用正确/定义的字符集和排序规则创建数据库。如何做到这一点?(在最好的情况下,无需更改服务器上的任何全局设置。)
详细版本:
上下文是 Symfony 4 应用程序和 Doctrine 2。DBMS:MySQL,操作系统:Ubuntu 14.04。我想用 Doctrine 创建数据库:
$ bin/console doctrine:database:create
后台执行Doctrine的SQL语句为:
CREATE DATABASE `mydb`
意思是:它不使用charset
and中的collate
设置,.../config/packages/doctrine.yaml
并且DATABASE_URL
in.../.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 |
+----------------------------+------------------------+
解决方案
这是另一个答案: Doctrine2: How to set all tables to collate with UTF8
他们建议在实体本身中使用 collate,但是您需要像这样指定所有实体,如果您有很多实体,那就有问题了
@ORM\Table(options={"collate"="utf8mb4_unicode_ci"})
第二种方法是使用选项doctrine.yml
doctrine:
dbal:
options:
1002: "SET NAMES 'utf8mb4_unicode_ci'"
第三种解决方案是编辑 mysql 配置文件并在那里添加默认字符集。
我的.cnf
[mysqld]
character-set-server=utf8mb4_unicode_ci
collation-server=utf8mb4_unicode_ci
MySQL 全局变量(用于当前会话)
SET GLOBAL `character_set_server` = 'utf8mb4';
SET GLOBAL `collation_server` = 'utf8mb4_unicode_ci';
推荐阅读
- typescript - 如何检查角度 8 中的下一个行为主题值
- swift - Swift:更改 UINavigationController 视图的高度
- sql-server - 正则表达式仅获取字符串中每个数字的最后一次出现
- wordpress - 插件擦除主题中的自定义帖子模板
- flutter - Flutter TextFormField 装饰
- python - 如何使用模糊的 wuzzy python 编写所有行?
- c# - C# - TcpClient 连接(和监听)是否使用带宽?
- python - 使用 QTextEdit 时的 Pyqt5 QGridlayout 问题
- umbraco8 - 在不使用 NodeId 或 Guid 的情况下设置 404 页面
- python - 自动为python中的图像创建文件夹