2012-04-21 33 views
32

Muy bien, así que he estado jugando con la API web Steam, tengo uno de los valores almacenados en una variable llamada $steam64. Cuando uso este código snipper para INSERTARLO en una base de datos mysql, inserta un entero completamente diferente de lo que está almacenado en la variable.Entero Incorrecto (2147483647) se inserta en MySQL?

$sql_query = "INSERT INTO users_info (steam64) VALUES ('$steam64')";

var_dump($steam64); devuelve el int reales, también lo hace eco de ella. No estoy muy seguro de lo que está pasando aquí, cualquier ayuda es apreciada.

+3

¿Qué * está * insertado (y qué * se * vació) y qué * es * el tipo de columna? Es probable que no sea un "error" en MySQL, lo que significa que el problema está en otra parte ... –

+0

no debería necesitar las comillas simples en un entero. puede estar intentando insertar la cadena '$ steam64' como un entero, convirtiéndolo en el proceso. – Lazerblade

+0

@pst '2147483647' se está insertando,' 76561197989628470' está siendo volcado, el tipo de columna es int (255). – Archey

Respuesta

34

Probablemente sea porque está ajustando la consulta entre comillas dobles, pero la variable está entre comillas simples, por lo que se está tratando como un literal, y si la columna es int obtendrá un 0 en su lugar.

Prueba esto:

$sql_query = "INSERT INTO users_info (steam64) VALUES ('" . $steam64 . "')"; 

Además, antes de que me flameado, asegúrese de leer sobre SQL injection en caso de variables que se publican directamente en las sentencias SQL que no está desinfección.

- Actualización -

Basado en su comentario del "valor objeto de dumping"; el número que intenta insertar es demasiado grande para sistemas de 32 bits. El máximo para 32 bits es , y el máximo para 64 bits es 18,446,744,073,709,551,615. Recomiendo convertir tu columna en un hash varchar(100) en lugar de un int, o cambiar a un sistema de 64 bits. Gran artículo sobre max ints here y here.

+0

aún inserta la int incorrecta. – Archey

+1

Actualización publicada. El número que intentas insertar es demasiado grande. –

+0

Gracias :) ¿Es PHP o MySQL el que tiene el límite? – Archey

51

2147483647 es el valor int más grande para mysql. Simplemente cambie el tipo de int a bigint.

+2

@ George. Gracias –

+0

Vale la pena señalar que BIGINT tiene un límite de -9223372036854775808 a 9223372036854775807 (firmado) o de 0 a 18446744073709551615 (sin firmar). si desea el entero POSTAL GRANDE SOLAMENTE, utilice algo como 'NOMBRE_CUELO' BIGINT (32) PREDETERMINADO SIN SEÑAL 0 – Lewis

-5
CREATE TABLE `dvouchers` (
    `2147483647` int(3) NOT NULL auto_increment, 
    `code` varchar(12) NOT NULL default '1', 
    `type` char(1) NOT NULL default '$', 
    `count` int(3) unsigned NOT NULL default '0', 
    `amount` int(3) unsigned default '0', 
    `notes` text, 
    `expiryDate` date default NULL, 
    `fkUserAdminId` int(11) NOT NULL default '0', 
    PRIMARY KEY (`2147483647`), 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
+1

hmm ... y esto responde a la pregunta porque ...? – kleopatra

+0

Esto no tiene sentido, no intente deducir ninguna ayuda de esta respuesta si está aquí con este problema. – Lewis

1

Ir a operaciones-> Opciones de tabla -> valores de cambio de incremento al mínimo o lo que usted desea incrementar ..

el gran problema de incremento automático que está a empezar desde la última entrada por error si es muy grande valor a continuación, iniciar un problema en el valor de inserción .. con nuestro tipo de datos predefinido
enter image description here

3

El tipo entero INT es el almacenamiento 4Bytes, se obtiene -2^(4*8-1)=-2147483648-2^(4*8-1)-1=2147483647, cuando se tiene "firmaron banderas ", si cambiar las banderas para sin firmar tendrá un rango de 0 a 2^(4*8)-1. MySQL admite BIGINT siendo 8Bytes de almacenamiento. Si intenta guardar un valor mayor, se guarda el valor máximo de la gama

-4

La manera más fácil es el cambio en el "int" MySQL para "varchar".

+0

No hagas esto. Nunca hagas esto VARCHAR es una representación de cadena y no numérica. No sería posible ejecutar operaciones matemáticas en una cadena. – mwieczorek

0

acuerdo con el cambio de tipo de datos BIGINT a partir de INTEGER. Actualmente la construcción de una aplicación web con Node.js/sequelize la refactor continuación resolvió el post número de teléfono de la forma de reaccionar-redux manipulado para '2147483647':

clientPhone: { 
    type: DataTypes.BIGINT, 
    allowNull: true 
}, 
1

El valor más grande para el tipo de datos INT es 2147483647. Si el número está insertando es más grande que 2147483647, entonces causará el problema. Para la solución, cambie el tipo de datos de INT a BIGINT, ya que BIGINT tiene un valor máximo de 9223372036854775807, podría resolver su problema. Eche un vistazo a este sitio: https://dev.mysql.com/doc/refman/5.7/en/integer-types.html

Cuestiones relacionadas