Tengo este escenario de ejemplo:
Código
mysql> CREATE TABLE ejemplo( -> nombres BINARY(20)); Query OK, 0 ROWS affected (0.39 sec) mysql> INSERT INTO ejemplo VALUES('Juan'),('Pepe'),('Jose'); Query OK, 3 ROWS affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM ejemplo; +----------------------+ | nombres | +----------------------+ | Juan | | Pepe | | Jose | +----------------------+ 3 ROWS IN SET (0.00 sec)
Hasta ahi como pueden ver todo funciona perfectamente bien ahora que ocurre si se quiere actualizar o eliminar algun dato, observen:
Código
mysql> UPDATE ejemplo SET nombres = 'Carlos' WHERE nombres = hex('Juan'); Query OK, 0 ROWS affected (0.00 sec) ROWS matched: 0 Changed: 0 Warnings: 0 mysql> UPDATE ejemplo SET nombres = 'Carlos' WHERE nombres = 'Juan'; Query OK, 0 ROWS affected (0.00 sec) ROWS matched: 0 Changed: 0 Warnings: 0 mysql> DELETE FROM ejemplo WHERE nombres = 'Pepe'; Query OK, 0 ROWS affected (0.00 sec) mysql> SELECT * FROM ejemplo; +----------------------+ | nombres | +----------------------+ | Juan | | Pepe | | Jose | +----------------------+ 3 ROWS IN SET (0.00 sec)
Un poco chungo no??? no elimino, ni actualizo nada... (Utilize la funcion HEX por recomendacion de la gente de MySQL ya que ellos decian que usase esta funcion para actualizar los datos y cerraron el reporte del bug, pero obviamente No funciona como pueden ver).
Ahora se que muchos diran ese problema se resuelve con un simple ALTER si claro, observen:
Código
mysql> DESCRIBE ejemplo; +---------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | Extra | +---------+------------+------+-----+---------+-------+ | nombres | BINARY(20) | YES | | NULL | | +---------+------------+------+-----+---------+-------+ 1 ROW IN SET (0.00 sec) mysql> ALTER TABLE ejemplo MODIFY nombres VARCHAR(25); Query OK, 3 ROWS affected (0.45 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> UPDATE ejemplo SET nombres = 'Carlos' WHERE nombres = 'Juan'; Query OK, 0 ROWS affected (0.00 sec) ROWS matched: 0 Changed: 0 Warnings: 0 mysql> DELETE FROM ejemplo WHERE nombres = 'Pepe'; Query OK, 0 ROWS affected (0.00 sec) mysql> SELECT * FROM ejemplo; +----------------------+ | nombres | +----------------------+ | Juan | | Pepe | | Jose | +----------------------+ 3 ROWS IN SET (0.00 sec)
Agur... no funciona. He reiniciado el servidor MySQL he reiniciado mi PC, he vuelto a ingresar al motor despues de reiniciado todo he intentado nuevamente lo anterior expuesto y NADA sigue sin Eliminar o Actualizar ningun dato.
Este problemita aplica tambien para tablas con otro tipo de dato (CHAR, VARCHAR, etc) y le cambies dicho campo a BINARY con ALTER, por ejemplo:
Código
mysql> CREATE TABLE ejemplo2( -> nombres VARCHAR(20)); Query OK, 0 ROWS affected (0.38 sec) mysql> INSERT INTO ejemplo2 VALUES('pepe'),('Juan'),('pedro'),('luis'); Query OK, 4 ROWS affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM ejemplo2; +---------+ | nombres | +---------+ | pepe | | Juan | | pedro | | luis | +---------+ 4 ROWS IN SET (0.00 sec)
Hasta ahi todo bien... de hecho puedo borrar o actualizar con el tipo de datos VARCHAR:
Código
mysql> UPDATE ejemplo2 SET nombres = 'Cucu' WHERE nombres = 'pepe'; Query OK, 1 ROW affected (0.00 sec) ROWS matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM ejemplo2; +---------+ | nombres | +---------+ | Cucu | | Juan | | pedro | | luis | +---------+ 4 ROWS IN SET (0.00 sec)
Hasta ahi todo bien ahora miren esto:
Código
mysql> ALTER TABLE ejemplo2 MODIFY nombres BINARY(20); Query OK, 4 ROWS affected (0.27 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM ejemplo2; +----------------------+ | nombres | +----------------------+ | Cucu | | Juan | | pedro | | luis | +----------------------+ 4 ROWS IN SET (0.00 sec) mysql> UPDATE ejemplo2 SET nombres = 'Marta' WHERE nombres = 'Cucu'; Query OK, 0 ROWS affected (0.00 sec) ROWS matched: 0 Changed: 0 Warnings: 0
No actualizo el dato tampoco borra para el que quiera intentarlo, ahora hago nuevamente ALTER para que mi tipo de dato sea otra vez VARCHAR pensando vagamente que esto resolvera este problema:
Código
mysql> ALTER TABLE ejemplo2 MODIFY nombres VARCHAR(20); Query OK, 4 ROWS affected (0.10 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> DESCRIBE ejemplo2; +---------+-------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | Extra | +---------+-------------+------+-----+---------+-------+ | nombres | VARCHAR(20) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 1 ROW IN SET (0.00 sec) mysql> UPDATE ejemplo2 SET nombres = 'Marta' WHERE nombres = 'Cucu'; Query OK, 0 ROWS affected (0.00 sec) ROWS matched: 0 Changed: 0 Warnings: 0
Como pueden ver en el campo Changed:0 indica que no actualizo los datos aun siendo VARCHAR tampoco elimina los datos siempre y cuando usemos constantes digase campo = algo
Reiniciar el motor MySQL no resuelve este problema, tampoco reiniciar el servidor como tal.
Porque coloco esto aqui? por el simple hecho de que si alguien tuviera un foro como este, con tablas llenas de datos millones de ellos, y alguien de alguna manera hackea la DB y hace un ALTER y coloca campo BINARY y luego un ALTER para retornar a VARCHAR y digamos que ese campo donde se aplico eso, es el campo Mensajes (POST) del foro, y luego ese usuario se antoja de entrar al foro y insultar , ofender y llenarlo de SPAM y el Admin no va a poder eliminar dichos posts... y tampoco recibira Error no Warnings recibira nada... Y asumo que lo mismo podria ocurrir a la hora de Banear a un usuario por su nick.
Por eso posteo eso aca, porque aunque es dificil lograr acceder como admin a un motor MySQL para hacer estos cambios, siempre buscan la via de llegar, y no es nada gracioso para ningun DBA ver que no puede borrar ni actualizar datos del motor y No saber porque.
Un saludo.