2012-08-13 54 views
6

Sé que esta pregunta se ha formulado más de una vez aquí, pero no he podido encontrar una solución.¿Cómo guardo un BIGINT en MySQL usando PDO?

Estamos utilizando una base de datos donde almacenamos el id de facebook como BIGINT (20).

create table users(
    fb_id bigint(20) NOT NULL, 
    user_name varchar(30) NOT NULL, 
    CONSTRAINT uk_name unique (user_name), 
    CONSTRAINT pk_fb_id primary key (fb_id) 
)ENGINE=INNODB; 

Pero el motor PDO de PHP puede insertar sólo el valor entero máximo de PHP, es decir 2147483647.

$stmt->bindParam(':fb_id', $this->fb_id, PDO::PARAM_INT); 

Esto, entiendo, es bastante obvio ya estamos limitados por el valor máximo de entero en PHP. Traté de usar la cadena -

$stmt->bindParam(':fb_id', $this->fb_id, PDO::PARAM_STR); 

pero todavía no funciona.

Quiero saber si podría haber una solución alternativa para almacenarlo como bigint.

+2

¿Qué hay de usar 'PDO :: PARAM_INT' pero estableciendo el valor en una cadena con un número realmente grande? '" 892347932075913 "' –

+1

Si uso 'PDO :: PARAM_INT', la' cadena grande 'se reduce a '2147483647', el valor máximo permitido. – banskt

+0

'PDO :: PARAM_STR' con el valor como' cadena larga' ¿tampoco funciona? No tengo idea entonces. –

Respuesta

5

Estamos utilizando una base de datos donde estamos almacenando el id de facebook como BIGINT (20).

¿Por qué estás haciendo eso?

Creo que el consenso general es que los ID de Facebook no deberían guardarse como tipos numéricos, sino como cadenas. Guardarlos como algo numérico no ofrece ninguna ventaja, sino varias desventajas.

+1

Tuvimos que almacenar el id de facebook como cadenas para resolver el problema. Pero realmente me gustaría saber cuáles son las desventajas, por mi propio conocimiento. ¿Podría por favor arrojar algo de luz sobre eso? – banskt

+1

Hay varios problemas que pueden ocurrir fácilmente, es decir su controlador de base de datos, de hecho, los devuelve como valores numéricos, que se transferirán a un flotador en PHP, que como sabrá, viene con una pérdida de precisión inmanente (por lo que su número de flotador termina siendo diferente al valor de identificación de usuario real), etc. – CBroe

+0

He leído que guardar los Id de Facebook como big_int acelerará las funciones de comparación en SQL, lo que siempre pensé que era falso. Siempre he creído que si el valor es enorme y tienes muchas filas, tomates resistentes: tendrás que ser creativo con la optimización de tus consultas, aceptar el hecho de que el ahorro como big_int no ofrecerá ninguna ventaja en absoluto. Esta respuesta anterior confirmó mi sospecha de que guardar como cuerda es la mejor práctica. – FredTheWebGuy