Cuando hago un app/console doctrine:schema:update --force Recibí este mensaje:

$ 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]]

Entonces intenté aumentar el tamaño de mi columna en mis entidades:

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

Lo aumento a 310, pero todavía no funciona. ¿Por qué no puedo actualizar mi esquema?

3
CE_ 22 dic. 2016 a las 15:02

2 respuestas

La mejor respuesta

Cambié mi tipo a text

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

Según la documentación: " Convierte datos de cadena sin una longitud máxima ".

0
CE_ 22 dic. 2016 a las 12:20

Puede encontrar todos los tipos de DBAL aquí en el Capítulo de documentación de Doctrine 2: 8. Tipos .

Para tipo de cadena, encuentra el siguiente comentario:

Los proveedores de bases de datos tienen diferentes límites para la longitud máxima de una cadena variable. Doctrine asigna internamente el tipo string al tipo text del proveedor si se excede la longitud máxima permitida. (...)

Para MySQL, este máximo es de 255 caracteres, pero de acuerdo con los documentos, debe usar texto cuando se exceda este valor. ¿Quizás la longitud de tu foto tenía más de 310 caracteres?

Establecer el tipo de datos en text como lo hizo funciona porque de acuerdo con los documentos:

Asigna y convierte datos de cadenas sin una longitud máxima. Si no conoce la longitud máxima de los datos que se almacenarán, debería considerar utilizar este tipo.

Entonces es una solución adecuada. Tenga en cuenta que podría ser más óptimo (mejor para el rendimiento) si define la longitud de las columnas de su base de datos.

2
Wilt 22 dic. 2016 a las 15:16