2011-05-06 15 views
8

(¿Alguna idea de por qué esto funciona con sensatez *:MySQL concat() e inferior) rarezas

mysql> select lower('AB100c'); 
+-----------------+ 
| lower('AB100c') | 
+-----------------+ 
| ab100c   | 
+-----------------+ 
1 row in set (0.00 sec) 

Pero esto no es así?

mysql> select lower(concat('A', 'B', 100,'C')); 
+----------------------------------+ 
| lower(concat('A', 'B', 100,'C')) | 
+----------------------------------+ 
| AB100C       | 
+----------------------------------+ 
1 row in set (0.00 sec) 

* sensibly = 'la forma en que creo que debería funcionar'.

+0

pregunta increíble! Acabo de terminar con esto y pude resolver mi problema en aproximadamente 30 segundos con este hilo. Gracias @shanusmagnus. (Estoy de acuerdo con su sensatez por cierto ... No puedo pensar en una razón por la cual una cuerda necesitaría contener '\ 0' solo porque representa un número.) –

Respuesta

6

Como se indica en MySql String functions:


INFERIOR (str)

INFERIOR() no es eficaz cuando se aplica a cadenas binarias (binario, VARBINARY, BLOB).


CONCAT (str1, str2, ...)

Devuelve la cadena que resulta de la concatenación de los argumentos. Puede tener uno o más argumentos. Si todos los argumentos son cadenas no binarias, el resultado es una cadena no binaria. Si los argumentos incluyen cadenas binarias, el resultado es una cadena binaria. A argumento numérico se convierte en su forma de cadena binaria equivalente; si quiere evitar eso, puede usar un modelo explícito.


En su código está de paso 100 como un valor numérico por lo concat devolverá una cadena binaria e inferior no es eficaz cuando se aplica a las cadenas binarias que por eso es que no se convierten. Si desea convertir usted puede intentar esto:

select lower(concat('A', 'B', '100','C')); 
+0

Gracias por la respuesta detallada: miré en el documento al que hace referencia, pero no pude entender la parte sobre cómo un argumento numérico convirtió el binario de la secuencia completa. – shanusmagnus

+0

Buena explicación. Gracias. Creo que esto sucede en versiones anteriores. Tuve un problema en 5.1.73. Pero no en 5.5.25a. Esta fue mi consulta (parte de la consulta) COALESCE (NULLIF (inferior (nombre), ''), inferior (concat ('Agente -', id_agente))) he cambiado a COALESCE (NULLIF (lower (name), ''), lower (concat ('Agent -', 'agent_id'))) Luego funcionó bien. – cha

2

inferior se usa para convertir STRINGS a minúsculas. Pero su valor 100 se considera numérico. Si desea aún así lograr el resultado de la conversión en minúsculas, se debe incluir el número entre comillas así:

select lower(concat('A', 'B', '100','C')); 

He probado esto y funciona bien.

+0

Idealmente, el codificador construirá la cadena concat en un idioma como PHP. Y si esto se generara dinámicamente (usando un bucle, por ejemplo), cada valor para concatenar será 'citado'.Así que supongo que la 'soltura' de la función concat no es un problema real. – itsols

-1

Y aquí es otro ejemplo con CONCAT y COMO

LOWER(CONCAT(firstname, ' ', lastname)) LIKE LOWER('%my name%')