更新我的架构时,Doctrine异常“数据太长了”

时间:2016-12-22 12:02:10

标签: symfony orm doctrine-orm doctrine

当我做app/console doctrine:schema:update --force时 我收到了这条消息:

$ app/console doctrine:schema:update --force
Updating database schema...


  [Doctrine\DBAL\Exception\DriverException]                                                                                                                 
  An exception occurred while executing 'ALTER TABLE recipes ADD has_video TINYINT(1) DEFAULT '0' NOT NULL, CHANGE photo photo VARCHAR(255) DEFAULT NULL':  
  SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'photo' at row 4268                                                          



  [Doctrine\DBAL\Driver\PDOException]                                                               
  SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'photo' at row 4268  



  [PDOException]                                                                                    
  SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'photo' at row 4268  


doctrine:schema:update [--complete] [--dump-sql] [-f|--force] [--em [EM]]

所以我尝试在我的实体中增加列的大小:

/**
 * @var string
 *
 * @ORM\Column(name="photo", type="string", length=310, nullable=true)
 * @Expose
 * @Groups({"All", "GlobalStats"})
 */
private $photo;

我将它增加到310,但它仍然不起作用。 为什么我不能更新我的架构?

2 个答案:

答案 0 :(得分:2)

您可以找到所有DBAL类型here in the Doctrine 2 documentation chapter: 8. Types

对于string type,您会发现以下评论:

  

数据库供应商对变化字符串的最大长度有不同的限制。如果超出允许的最大长度,Doctrine会在内部将string类型映射到供应商的text类型。 (...)

对于MySQL,这个最大值为255个字符,但根据文档,当超过此值时,它应该使用文本。也许你的照片长度超过310个字符?

将数据类型设置为text,就像您所做的那样有效,因为根据文档:

  

映射并转换没有最大长度的字符串数据。如果您不知道要存储的数据的最大长度,则应考虑使用此类型。

所以这是一个合适的解决方案。 请记住,如果定义数据库列的长度,它可能会更优化(性能更好)。

答案 1 :(得分:0)

我将类型更改为text

 /**
     * @var text
     *
     * @ORM\Column(name="photo", type="text", nullable=true)
     * @Expose
     * @Groups({"All", "GlobalStats"})
     */
    private $photo;

根据documentation:"转换没有最大长度的字符串数据。"