Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] ¿Por qué MySQL en vez de guardar el año guarda el número 127?

Estas en el tema de ¿Por qué MySQL en vez de guardar el año guarda el número 127? en el foro de Mysql en Foros del Web. Buena tarde! Estoy jugando con un formulario que tiene, entre otras cosas, 3 input text en los que el usuario debe introducir su fecha de ...
  #1 (permalink)  
Antiguo 21/04/2014, 18:40
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
Pregunta ¿Por qué MySQL en vez de guardar el año guarda el número 127?

Buena tarde!

Estoy jugando con un formulario que tiene, entre otras cosas, 3 input text en los que el usuario debe introducir su fecha de nacimiento. Los guardo en la BD:
Código MySQL:
Ver original
  1. INSERT INTO `mi_bd`.`mi_tabla` (`id`, `dia`, `mes`, `anio`) VALUES ('', '$dia', '$mes', '$anio')

Pero por alguna razón extraña, al ver el contenido de la BD, mediante una consulta o por phpMyAdmin, veo que el campo anio no contiene la fecha introducida, digamos 1979, sino siempre un 127. ¿Por qué?

¿Acaso es coincidencia y tiene algo que ver con el http://127.0.0.1 del servidor local?


Saludos!


Última edición por gnzsoloyo; 21/04/2014 a las 18:55
  #2 (permalink)  
Antiguo 21/04/2014, 18:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿Por qué MySQL en vez de guardar el año guarda el número 127?

Cita:
Pero por alguna razón extraña, al ver el contenido de la BD, mediante una consulta o por phpMyAdmin, veo que el campo anio no contiene la fecha introducida, digamos 1979, sino siempre un 127
No es ninguna razón extraña. Es simplemente que has cometido dos errores:
1) Declaraste el año como TINYINT con signo, lo que hace que su rango de representación sea de -128 a + 127. Muy mala elección para un número que almacenará años...
2) Creaste tres campos para un dato que se almacena en uno sólo. Las fechas se deben almacenar en campos DATE, DATETIME o TIMESTAMP, pero no deben almacenarse en campos separados. Es un desperdicio de recursos y resulta ineficiente para las consultas.

Para corroborar lo que digo, hagamos una cosa: Ejecutaa esto y postea el resultado:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE `mi_bd`.`mi_tabla`
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/04/2014, 22:02
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
Pregunta Respuesta: ¿Por qué MySQL en vez de guardar el año guarda el número 127?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
1) Declaraste el año como TINYINT con signo...
2) Creaste tres campos para un dato que se almacena en uno sólo. Las fechas se deben almacenar en campos DATE, DATETIME o TIMESTAMP...

Ejecutaa esto:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE `mi_bd`.`mi_tabla`
Gracias por responder, maestro gnzsoloyo.

Respondo a tu
s 3 indicaciones:
1. Tienes razón, no le quité el signo al TINYINT. En Atributos seleccioné la opción UNSIGNED, y la cosa no cambió mucho. Ahora me pone 255 en vez de 127.

2. Al crear el formulario, vi que iba a ser una lata poner un sólo input text para que el usuario escribiera su fecha de nacimiento, porque la iba a poner en el formato que le diera en gana, y validar eso resultaría muy cansado. De ahí los 3 input text, así no hay pierde. Con un poco de javascript hago que admitan sólo números, que los dígitos sean sólo dos para los meses y 4 para el año... y se acabó. Maestro gnzsoloyo, por favor dame una alternativa a esto.

3. Por último, pides que ejecute una consulta. Acerca de ello, lo hice en la pestaña SQL del phpMyAdmin, la consulta fue exitosa... No noté ningún cambio.


Saludos!
  #4 (permalink)  
Antiguo 22/04/2014, 01:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: ¿Por qué MySQL en vez de guardar el año guarda el número 127?

Cita:
1. Tienes razón, no le quité el signo al TINYINT. En Atributos seleccioné la opción UNSIGNED, y la cosa no cambió mucho. Ahora me pone 255 en vez de 127.
El problema no es el signo sino el TINYINT, definelo como INT(4).... pero mejor haz caso a @gnzsoloyo y crea un campo date.

Cita:
2. Al crear el formulario, vi que iba a ser una lata poner un sólo input text para que el usuario escribiera su fecha de nacimiento, porque la iba a poner en el formato que le diera en gana, y validar eso resultaría muy cansado. De ahí los 3 input text, así no hay pierde. Con un poco de javascript hago que admitan sólo números, que los dígitos sean sólo dos para los meses y 4 para el año... y se acabó. Maestro gnzsoloyo, por favor dame una alternativa a esto.
Algo de javascript para validar el formato de fecha, busca que hay scripts hechos.

Si no con lo que tines hecho construyes la fecha en el formato de mysql y la guardas en un campo date

Código MySQL:
Ver original
  1. INSERT INTO `mi_bd`.`mi_tabla` (`id`, `fechaNacimiento`) VALUES ('', '"$anio."-".$mes."-".$dia"')

(ojo que he usado un poco de php)

Cita:
3. Por último, pides que ejecute una consulta. Acerca de ello, lo hice en la pestaña SQL del phpMyAdmin, la consulta fue exitosa... No noté ningún cambio.
esa consulta no es para que se produzca ningún cambio simplemente es para que MUESTRE (SHOW) la estructura de creación de la tabla con la que estamos trabajando y lo puedas postear, de manera que todos tengamos la información completa del problema.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 22/04/2014, 05:31
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
De acuerdo Respuesta: ¿Por qué MySQL en vez de guardar el año guarda el número 127?

Cita:
Iniciado por quimfv Ver Mensaje
El problema no es el signo sino el TINYINT, definelo como INT(4).... pero mejor haz caso a @gnzsoloyo y crea un campo date.
Buen día, maestro quimfv. Lo puse en INT(4) y funcionó
Aunque al mirar las opciones que tenía para la fecha (¡lo que es no poner atención!), vi que había un tipo YEAR, .

Cita:
Iniciado por quimfv Ver Mensaje
...esa consulta no es para que se produzca ningún cambio simplemente es para que MUESTRE (SHOW) la estructura de creación de la tabla...
Ok, entendido y aquí está el resultado. Dejé la tabla como estaba inicialmente:




Saludos!
  #6 (permalink)  
Antiguo 24/04/2014, 01:51
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: ¿Por qué MySQL en vez de guardar el año guarda el número 127?

Mejor hazle caso a gnzsoloyo y guarda la fecha en un campo de tipo DATE, mientras que para el ingreso de la misma en un formulario, utiliza un input de tipo 'date' o el datapicker de jQuery. Con esto, te olvidas del problema de que el usuario ingrese cualquier dato, aunque claro, la validación del lado del servidor la tendrás que hacer de todos modos, para lo cual, solamente tendrías que desglosar a la fecha en tres datos a partir de los guiones que hay entre el año, mes y día. Y si quieres validar con JavaScript, pues el procedimiento sería el mismo. Ojo, en PHP hay una función que valida fechas.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 26/04/2014, 11:59
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
De acuerdo Respuesta: ¿Por qué MySQL en vez de guardar el año guarda el número 127?

Cita:
Iniciado por Alexis88 Ver Mensaje
Mejor hazle caso a gnzsoloyo y guarda la fecha en un campo de tipo DATE, mientras que para el ingreso de la misma en un formulario, utiliza un input de tipo 'date' o el datapicker de jQuery...

Perdón por contestar tan tarde, pero he estado ocupado con el trabajo que me traigo a casa.

Excelente, maestro! Veo que HTML5 incorpora varios tipos de input, entre los cuales está el tipo date que mencionas. Ya lo vi en funcionamiento y es increíble. El problema sería con los navegadores medio viejos. Pero para esto está el datapicker de jQuery que mencionas, que igualmente está increíble. Sin duda, voy a usarlos y a olvidarme de la forma garagera que me estaba aventando.



Saludos!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:04.