Como un artículo anterior este viene de la mano de ^Tifa^ y como su descubridora todos los méritos a su persona.
El escenario
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)
Ese es el escenario.
Ahora una actualización de datos:
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)
Como se aprecia ni se actualiza ni se borra...
Intentamos solucionar el tema con un alter:
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)
ni por ahí...
Esto también se aplica también a tablas con datos tipo char, varchar,etc
si se altera a binary.
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)
Un ejemplo con varchar funcionando perfectamente
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)
Ahora alteramos a Binary
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
se jodió la tabla...
volvemos a varchar
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 se aprecia gracias al Changed: 0
no se actualizaron los datos pese a su tipo varchar.
Fuente original: Mini-Bug en Mysql