[英]MySQL / MariaDB not accepting JSON Format? Can not create Database
我目前在 phpmyadmin 上使用 XAMPP/Apache 和 MariaDB。 我正在尝试根据我的代码使用 Doctrine 创建一个表格,因此使用 Annotations 来验证表单。 我只是想将表单中输入的值存储在数据库中。 在另一个例子中,这工作得很好。
但是现在我有一个“复选框字段”,我猜它在创建数据库时会引起某种麻烦。
我在控制台中使用这些命令:
php bin/console make:migration
然后:
php bin/console doctrine:migrations:migrate
当调用第二个 = 当我尝试在我的数据库中创建表时,我收到以下错误:
Migration 20181121103017 failed during Execution.
Error An exception occurred while executing 'CREATE TABLE pizza (id INT
AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL
phone VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL,
size INT NOT NULL, ingredient JSON NOT NULL COMMENT '(DC2Type:json_array)', delivery INT NOT NULL,
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB':
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in
your SQL syntax; check the manual that
corresponds to your MariaDB server version for the right syntax to use near
'JSON NOT NULL COMMENT '(DC2Type:json_
array)', delivery INT NOT NULL, PRIMARY KEY' at line 1
我真的不知道我在这一点上做错了什么。
这些是我在“Pizza.php”文件中的注释。
// ------------------
/**
* @Assert\NotBlank(
* message = "E-Mail Address required"
* )
* @Assert\Email(
* message = "The email '{{ value }}' is not a valid email."
* )
* @Assert\Length(min="2", max="255")
* @ORM\Column(type="string", length=255)
*/
protected $email;
// ------------------
/**
* @Assert\Range(min=0, max=3)
* @ORM\Column(type="integer")
*/
protected $size;
// ------------------
/**
*@Assert\NotBlank(
* message = "Choose at least 1 ingredient!"
* )
* @ORM\Column(type="array")
*/
protected $ingredient;
// ------------------
/**
* @Assert\NotBlank(
* message = "Choose a delivery option!"
* )
* @Assert\Range(min=0, max=1)
* @ORM\Column(type="integer")
*/
protected $delivery;
表单本身工作得很好,验证确实按照我的意图工作。
我到底做错了什么?
如果您需要我的“Pizza.php”(实体类)或我进行路由的控制器文件中的更多代码,请告诉我。
我很感激任何帮助!
根据您的评论,Doctrine 似乎认为它可以使用您的 mariadb 版本不可用的功能。
如果您告诉LONGTEXT
您使用的是哪个版本,它会为该列选择正确的数据类型,在这种情况下可能是LONGTEXT
或类似的东西。
根据您使用的内容,它看起来像(例如在 symfony 中使用 yaml 文件):
doctrine:
dbal:
server_version: '10.1'
请注意,您需要重新生成迁移。
就像我在评论中提到的那样,我个人会标准化数据库并使用不同的表将比萨饼与成分联系起来,以便更轻松地搜索和过滤。
首先检查您的 mariadb 版本。 10.1 版不支持 JSON 数据类型,并且对 10.2 版的支持不完整。
一种解决方法是将dotric.yaml文件中的版本改为
server_version: '5.6'
然后重新生成 getter 和 setter
php bin/console make:entity --regenerate
然后生成迁移文件
php bin/console make:migration
这将生成一个数据类型设置为LONGTEXT的迁移文件。
之后,在src/Migrations 中打开每个文件并检查任何数据类型为JSON 的迁移文件,并删除所有具有此类数据类型的迁移。 请记住,如果您不删除这些文件,则下一个命令将迭代每个文件,从旧文件开始将它们一个一个地保存到数据库中。 如果存在这样的文件,它将再次触发错误。
最后,运行
php bin/console doctrine:migrations:migrate
这将相应地将所有迁移持久化到数据库。
有同样的问题,我找到了这个解决方法:
在Doctrine.yaml
发现 server_version 高于我的 MariaDB 版本,所以我在这一行中更正了这一点:
doctrine:
dbal:
server_version: '5.5'
我没有工作,直到我手动删除了我已经做过的迁移。 您可以在src/Migrations
找到它们。
然后再次运行:
php bin/console make:migration
php bin/console doctrine:migrations:migrate
这完成了工作,希望它有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.