De errores de MySQL

Cabezon's picture

Estoy haciendo un script en Perl que tiene que añadir/updatear unos datos en un base de datos de MySQL.

El script es bastante sencillo, ya que sólo trata de parsear unos logs. Sólo estaba teniendo un poco de problema con los comandos MySQL. El primero porque de los logs estaba sacando unas fechas con formato 03/07/2007, cuando MySQL las espera 2007/03/07.

Así que me pasé la trade del jueves en busca de una función que me cambiara el formato de la fecha... Errónemente me fui hacia DATE_FORMAT y estuve toda la tarde tratando de hacer un insert con date_format.
Alguien de la lista de Badopi me corrigió, y me dijo que me mirara str_to_date, y la cosa mejoró (si es que no hay nada como mirar la función la toca en el momento adecuado!). Así que emepcé con mis inserciones:

my $insert_start = $dbh->prepare("INSERT INTO job (start_date,user,`group`) VALUES (STR_TO_DATE(?,'%d/%m/%Y'),?,?)")
or die "Cannot prepare: ", $dbh->errstr();

y luego ejecutamos:

$insert_start -> execute ($start_date,$user,$group);
$insert_start -> finish;

Y todo funcionaba perfectamente. Hay que tener en cuenta que en los logs sólo tenía una linia (por simplificar).
Así que con la linia correctamente puesta, cambié el log y puse el de verdad (con varios MB de tamaño).

Entonces el script dejó de funcionar, y porque? por el siguiente error:
DBD::mysql::st execute failed: Column 'start_date' cannot be null at ./parser.pl line 80, line 2.

Y esto repetido N veces..
Me tiré el viernes buscando el puto error, y esta mañana igual... Como puede ser que start_date sea NULL si cuando saco la variable por pantall me dice que ésta vale: 03/22/2007?

Nada, que tras buscar y buscar he caido en el porque del puto error: el formato de la fecha!. En mi str_to_date le digo que le pasaré un fecha con formato día(2 dígitos)/mes(2 dígitos)/año(4 dígitos), y si os fijáis, las fechas que he utilizado están expresadas en mes/día/año, aunque claro, la primera al ser 03/07 daba igual el formato!.

Tonto por mi parte no fijarme más, pero vaya con el error de MySQL, la función esa no podría incorporar un aviso de "Eh! que estyás poniendo mal el formato!"....