Selección de mayúsculas y minúsculas de MySQL


242

¿Alguien puede decirme si una SELECTconsulta MySQL distingue mayúsculas o minúsculas por defecto? Y si no, ¿qué consulta tendría que enviar para poder hacer algo como:

SELECT * FROM `table` WHERE `Value` = "iaresavage"

Donde en realidad, el valor real de Valuees IAreSavage.


44
En última instancia, depende de la clasificación archivada, si es '_ci' (no distingue entre mayúsculas y minúsculas) o '_cs' (distingue entre mayúsculas y minúsculas)
Jovan Perovic

15
Esta es una pregunta mal redactada;). La mitad de las respuestas le muestran cómo hacer una comparación entre mayúsculas y minúsculas, la mitad apuntan a mayúsculas y minúsculas. Y solo 1 le dice que el valor predeterminado no distingue entre mayúsculas y minúsculas. :) Vale la pena señalar que la insensibilidad a mayúsculas y minúsculas funciona incluso cuando se hace una comparación como'value' in ('val1', 'val2', 'val3')
SaltyNuts

55
¡Hombre @SaltyNuts, leer esta pregunta 7 años después y darse cuenta de cuánto novato era vergonzoso! Podría haber leído la documentación y la respuesta es como la primera oración sobre las declaraciones SELECT ...
NoodleOfDeath

Para agregar a lo que dijo @JovanPerovic, utf8_bin también lo hace sensible a mayúsculas y minúsculas. No estoy seguro de si eso existía en ese entonces
Chiwda

Respuestas:


494

No distinguen entre mayúsculas y minúsculas , a menos que haga una comparación binaria .


3
Principalmente estoy de acuerdo con el comentario de Tim, no creo que hacer un "menor ()" en sus valores en todas partes sea la mejor manera de manejarlo, parece una solución alternativa. Pero lo admito a veces tiene sentido y es más fácil. (Colin mencionó que la clasificación era mejor). Los datos históricos se movieron a la tabla mysql que rompió la lógica heredada debido a que ciertos valores de columna tienen mayúsculas y minúsculas insensibles. Necesitábamos saber la diferencia entre "GE1234" y "ge1234", debían ser únicos y mantenerse registrados de esa manera. En su lugar, configuramos nuestra columna en la instrucción de creación de tabla: varchar (20) CHARACTER SET utf8 COLLATE utf8_bin
gregthegeek

19
No sé por qué tanta gente votó por esto. Establece claramente aquí dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html que "... esto significa que para los caracteres alfabéticos, las comparaciones serán sensibles a mayúsculas y minúsculas". Entonces, si busco 'DickSavagewood' NO recogería 'dicksavagewood'. Hacer lo mismo con LOWER () lo recogerá. Entonces, mi respuesta a la pregunta: en su caso particular, SELECT es sensible a mayúsculas y minúsculas.
Luftwaffle

10
@ user1961753: Lea nuevamente: "Para cadenas binarias (varbinary, blob) ... será sensible a mayúsculas y minúsculas".
Marc B

1
@MarcB este enlace ahora está roto. ¿Podrías arreglarlo? :)
Phiter

55
Como dijo Jovan, depende de la recopilación, por lo que esta respuesta es bastante incorrecta.
phil294

117

Puede poner en minúscula el valor y el parámetro pasado:

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")

Otra (mejor) forma sería usar el COLLATEoperador como se dice en la documentación


21
¿Cómo se vería esta SELECTdeclaración usando COLLATEentonces?
Sí, Barry, el

11
En la página de documentación mencionada anteriormente, dice que "las comparaciones de cadenas no binarias no distinguen entre mayúsculas y minúsculas de forma predeterminada".
Por Quested Aronsson

99
Es aterrador cuántas personas votaron por esta respuesta. Como @Marc explica anteriormente, las comparaciones no distinguen entre mayúsculas y minúsculas. Debe comprender las intercalaciones y los índices y configurarlos correctamente: el uso de transformaciones de cadena como LOWER()o una COLLATEcláusula arbitraria puede omitir por completo un índice y, con el tiempo, a medida que su tabla crezca, esto puede tener consecuencias drásticas en el rendimiento. Probablemente estos son los nombres de usuario que estás buscando. Utilice una clasificación sin distinción entre mayúsculas y minúsculas y agregue un índice único a la columna. Use EXPLAINpara confirmar que se está utilizando el índice.
mindplay.dk

1
Estaba a punto de decir lo mismo que mindplay.dk ... upper () y lower () omiten el índice y afectan directamente el rendimiento en tablas de bases de datos grandes.
GTodorov

Estoy de acuerdo con las opiniones de mindplay.dk y GTodorov. Tenga cuidado al usar algún método en una columna de destino en la cláusula where. El índice de la columna puede ser inútil. Utilice EXPLICAR!
traeper

51

USO BINARIO

Esta es una selección simple

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

Esta es una selección con binario

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

o

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0


3
¿Cuándo tiene sentido usar BINARY en un solo lado de = (SELECT * FROM myTable WHERE BINARY 'something' = 'Something')?
Jimmy

@ Jimmy ¿Qué quieres decir exactamente? El código funciona Cuando un lado de la comparación se convierte en binario, la comparación se hace binaria.
Jori

@Jori Oh, supongo que leí mal: pensé que uno de los dos ejemplos tenía BINARY en ambos lados de la misma.
Jimmy

Acabo de votar porque esta es realmente la respuesta correcta. De acuerdo con la documentación en el sitio web de MySQL, dicen que es mejor usar el comando BINARY que tratar de escribir sus palabras / solicitudes en un idioma específico porque el comando BINARY dice que debe dejar todo como está y usarlo exactamente como Se presenta. Entonces, cuando llegué buscando una respuesta, las dos respuestas aquí me llevaron al sitio web de MySQL y a ver su documentación. Usar BINARY es mejor. Traducir puede causar otros problemas.
Mark Manning

43

Las comparaciones no distinguen entre mayúsculas y minúsculas cuando la columna usa una clasificación que termina con _ci(como la clasificación predeterminada latin1_general_ci ) y distinguen entre mayúsculas y minúsculas cuando la columna usa una clasificación que termina con _cso _bin(como las clasificaciones utf8_unicode_csy utf8_bin).

Comprobar colación

Puede verificar su servidor , base de datos y colaciones de conexión usando:

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

y puede verificar la clasificación de su tabla usando:

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

Cambiar colación

Puede cambiar la clasificación de su base de datos, tabla o columna a algo sensible a mayúsculas y minúsculas de la siguiente manera:

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- or change column collation
ALTER TABLE `table` CHANGE `Value` 
    `Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

Sus comparaciones ahora deben ser sensibles a mayúsculas y minúsculas.


25

La comparación de cadenas en la frase WHERE no distingue entre mayúsculas y minúsculas. Podrías intentar comparar usando

WHERE `colname` = 'keyword'

o

WHERE `colname` = 'KeyWord'

y obtendrás el mismo resultado . Ese es el comportamiento predeterminado de MySQL.

Si desea que la comparación distinga entre mayúsculas y minúsculas , puede agregar COLLATEasí:

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

Ese SQL daría un resultado diferente con este: DONDE colname COLLATE latin1_general_cs = 'keyword'

latin1_general_cs es una clasificación común o predeterminada en la mayoría de las bases de datos.


16

La intercalación que elija establece si distingue entre mayúsculas y minúsculas o no.


9

El valor predeterminado no distingue entre mayúsculas y minúsculas, pero la siguiente cosa más importante que debe observar es cómo se creó la tabla en primer lugar, porque puede especificar mayúsculas y minúsculas cuando crea la tabla.

El siguiente script crea una tabla. Observe en la parte inferior que dice "COLLATE latin1_general_cs". Eso cs al final significa mayúsculas y minúsculas. Si desea que su tabla no distinga entre mayúsculas y minúsculas, puede dejar esa parte fuera o usar "COLLATE latin1_general_ci".

   CREATE Table PEOPLE (

       USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

       FIRST_NAME  VARCHAR(50) NOT NULL,
       LAST_NAME  VARCHAR(50) NOT NULL,

       PRIMARY KEY (USER_ID)

   )

   ENGINE=MyISAM DEFAULT CHARACTER SET latin1
    COLLATE latin1_general_cs AUTO_INCREMENT=0;

Si su proyecto es tal que puede crear su propia tabla, entonces tiene sentido especificar su preferencia de mayúsculas y minúsculas cuando cree la tabla.




2

Tenga en cuenta también que los nombres de tabla distinguen entre mayúsculas y minúsculas en Linux a menos que establezca la lower_case_table_namedirectiva de configuración en 1 . Esto se debe a que las tablas están representadas por archivos que distinguen entre mayúsculas y minúsculas en Linux.

Especialmente tenga cuidado con el desarrollo en Windows que no distingue entre mayúsculas y minúsculas y que se implementa en la producción donde está. Por ejemplo:

"SELECT * from mytable" 

contra la tabla myTable tendrá éxito en Windows pero fallará en Linux, de nuevo, a menos que se establezca la directiva mencionada anteriormente.

Referencia aquí: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html


1
+1 - El escenario de escribir consultas que no distinguen entre mayúsculas y minúsculas y luego fallar en Linux sucedió mucho en nuestro proyecto
Vic

@Vic Tengo el mismo problema con mi proyecto. ¿Podría decirme cómo lo solucionó?
Kamran Ahmed

@KamranAhmed, debe usar la carcasa de los nombres de las tablas exactamente como aparecen en los scripts de creación
Vic

@Vic ese sería el último recurso, ya que tendría que modificar literalmente toneladas de consultas. Me preguntaba si habría alguna manera fácil de hacerlo. Gracias sin embargo!
Kamran Ahmed

@KamranAhmed, intente cambiar el lower_case_table_namecomo se especifica en la respuesta que estamos comentando
Vic

1

La solución actualmente aceptada es principalmente correcta.

Si está utilizando una cadena no binaria (CHAR, VARCHAR, TEXT), las comparaciones no distinguen entre mayúsculas y minúsculas , según la clasificación predeterminada.

Si está utilizando una cadena binaria (BINARY, VARBINARY, BLOB), las comparaciones distinguen entre mayúsculas y minúsculas, por lo que deberá usar LOWER como se describe en otras respuestas.

Si no está utilizando la intercalación predeterminada y está utilizando una cadena no binaria, la distinción de mayúsculas y minúsculas decidirá la distinción entre mayúsculas y minúsculas.

Fuente: https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html . Lee atentamente. Algunos otros lo han confundido al decir que las comparaciones son necesariamente sensibles a mayúsculas o minúsculas. Este no es el caso.


0

Puedes probarlo. Espero que sea útil.

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "IAreSavage"

0

Los campos de cadena con la bandera binaria siempre serán sensibles a mayúsculas y minúsculas. Si necesita una búsqueda sensible a mayúsculas y minúsculas para un campo de texto no binario, use esto: SELECCIONE 'prueba' REGEXP BINARY 'TEST' COMO RESULTADO;

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.