quiero advertir a todos los que alguna vez quieran usar tipo de datos BINARY en sus tablas.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 = algoReiniciar 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.





Autor


En línea


pero espero que no sea negativo. Lo coloque aca porque aparentemente el equipo de desarrollo de SUN no esta en arreglar cosas internas de MySQL a no ser que sean extremadamente muy graves. Y puestos que ellos ignoraron el reporte y me dieron una respuesta un poco tonta y muy diferente a lo que yo les pregunte.... pues pense que era beneficioso colocar la info aca, mas para tener eso pendiente no para hacerle una broma a nadie.
eso hice xD
) por esto:



