Recentemente, tive um problema em que notei que o MySQL ignorava espaços em branco à direita ao emitir um GROUP BY. Aqui está a tabela:
CREATE TABLE `myTable` (
`id` int(10) unsigned NOT NULL,
`foo` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
E aqui está um exemplo de consulta que executei (não é um uso de produção, mas mostra o que estou tentando corrigir):
SELECT foo, CHAR_LENGTH(foo) FROM myTable
WHERE foo='bar'
GROUP BY foo
Que retornaria um conjunto de resultados:
| foo | CHAR_LENGTH(foo) |
+------+-------------------+
| Bar | 4 |
Tudo muito bem, exceto 'Bar' é comprimento três, não quatro. Então fui examinar as entradas individuais (sem grupo por):
SELECT foo, CHAR_LENGTH(foo) FROM myTable
WHERE foo='bar'
| foo | CHAR_LENGTH(foo) |
+------+-------------------+
| Bar | 3 |
| Bar | 3 |
| Bar | 3 |
| Bar | 4 |
| Bar | 3 |
Agora, há cinco entradas para Bar, quatro das quais relatam corretamente um comprimento 3. Mas há uma que relata um comprimento de quatro.
Acontece que aquele com comprimento quatro tem um espaço no final: "Barra". Eu esperava GROUP BY
tratar isso como um valor completamente diferente e não agrupá-lo com as outras "Barras".
Existe uma maneira de dizer ao MySQL para considerar valores diferentes se eles tiverem espaços em branco à direita (ou à esquerda)?
(executando mysql 5.1.55 64 bits no mac osx)
char
os valores são preenchidos com espaços quando são armazenados, portanto, todos os espaços em branco à direita são considerados preenchidos e removidos ao recuperar valores.varchar
os campos manterão o espaço em branco à direita, mas por padrão ele será removido para comparações. (verThe CHAR and VARCHAR types
)Para reter o espaço em branco à direita para
varchar
valores, use obinary
operador. Algo comoSELECT foo, CHAR_LENGTH(foo) FROM myTable WHERE foo='bar' GROUP BY BINARY foo
deve fazer o que você quer.A
GROUP BY
cláusula pode ser vários campos e/ou campos calculados: