Error de SQL truncado al insertar UUID

Estoy creando una aplicación PHP basada en una base de datos que usa UUID para almacenar cada fila de datos. La aplicación actualmente genera los UUID utilizando la siguiente consulta:

    SELECT UUID()

que genera una salida similar a 84058227-294c-11e3-916a-7a7919b2b2bc.

Muchas fuentes en línea sugieren que los UUID se almacenen en BINARY(16) para mejorar el rendimiento general de la aplicación. Pero cuando intento insertar el UUID en la base de datos, recibo el siguiente error:

    Warning: #1265 Data truncated for column 'x' at row x

Me doy cuenta de que este error ocurrió porque el UUID era demasiado grande para que la columna lo almacenara, y que este problema se puede solucionar fácilmente simplemente aumentando la cantidad de caracteres que la columna puede almacenar (por ejemplo: BINARY(20)), pero me temo que hacerlo puede reducir el rendimiento de la aplicación en el futuro.

Teniendo en cuenta que tantas fuentes en línea sugieren usar BINARY(16) para almacenar UUID, supongo que cometí un error.

¿Podría alguien señalarme en la dirección correcta?

Para obtener información adicional, aquí está el código que estoy usando (en PHP) para insertar datos en la base de datos:

    //PDO Query
    $this->query(
        INSERT INTO users
            (
                user_id,        //the UUID is stored in this column
                taxonomy_id,
                user_email,
                user_password,
                user_salt,
                user_activation_key,
                user_is_administrator
            )
            VALUES(?,?,?,?,?,?,?)
            ',
            array(
                $this->uuid(),    //method that generates UUID
                $taxonomy_id,
                $user_email,
                $user_password,
                $user_salt,
                $user_activation_key,
                $user_is_administrator
            )
        )
    );

y el método que genera cada UUID:

    public function uuid()
    {
        $uuid = $this->query("SELECT UUID() AS uuid");
        return $uuid[0]['uuid'];
    }

preguntado el 29 de septiembre de 13 a las 22:09

1 Respuestas

El valor subyacente de un UUID es un número de 128 bits, que se puede almacenar como un binary(16) desde 8*16 >= 128. Sin embargo, la función SQL integrada UUID está utilizando (suponiendo que MySQL... no nombró el RDBMS) representa el número de 128 bits como una cadena de 36 caracteres, que es la forma normal legible por humanos de un UUID. Por lo tanto, deberá almacenarlo en un campo de texto de longitud >= 36, como un varchar(36).

A menos que su aplicación vaya a generar una gran cantidad de datos y consultas, la diferencia entre 16 bytes en un campo binario y 36 bytes en un campo de caracteres no afectará su rendimiento. Otros problemas como la indexación y el diseño adecuado de las consultas (y especialmente las sugerencias si usa MySQL) tendrán un efecto mucho mayor en su rendimiento general.

Respondido 01 Oct 13, 14:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.