tablas sensibilidad primera nombres minúsculas minusculas mayúsculas mayusculas mayuscula lower_case_table_names los letra las ignorar identificar diferenciar mysql replace

sensibilidad - mysql mayuscula primera letra



Insensible a mayúsculas ¿REPLACE en MySQL? (7)

MySQL ejecuta prácticamente todas las comparaciones de cadenas en la intercalación predeterminada ... excepto el comando REPLACE . Tengo una intercalación insensible a mayúsculas y minúsculas y necesito ejecutar un REPLACE insensible a mayúsculas y minúsculas. ¿Hay alguna manera de obligar a REPLACE uso de la intercalación actual en lugar de hacer comparaciones entre mayúsculas y minúsculas? Estoy dispuesto a actualizar mi MySQL (actualmente ejecutando 5.1) para obtener funcionalidad adicional ...

mysql> charset utf8 collation utf8_unicode_ci; Charset changed mysql> select ''abc'' like ''%B%''; +------------------+ | ''abc'' like ''%B%'' | +------------------+ | 1 | +------------------+ mysql> select replace(''aAbBcC'', ''a'', ''f''); +-----------------------------+ | replace(''aAbBcC'', ''a'', ''f'') | +-----------------------------+ | fAbBcC | <--- *NOT* ''ffbBcC'' +-----------------------------+


En el caso de caracteres "especiales" hay un comportamiento inesperado:

SELECT case_insensitive_replace(''A'', ''Ã'', ''a'')

Da

a

Lo cual es inesperado ... ya que solo queremos reemplazar el à no A

Lo que es aún más extraño:

SELECT LOCATE(''Ã'', ''A'');

da

0

Cuál es el resultado correcto ... parece tener que ver con la codificación de los parámetros del procedimiento almacenado ...


En las respuestas anteriores, y en el enlace de pento.net, los argumentos para LOCATE() están en minúsculas.

Esto es una pérdida de recursos, ya que LOCATE no distingue entre mayúsculas y minúsculas por defecto:

mysql> select locate(''el'', ''HELLo''); +-----------------------+ | locate(''el'', ''HELLo'') | +-----------------------+ | 2 | +-----------------------+

Puedes reemplazar

WHILE Locate( LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency ) > 0 DO

con

WHILE Locate(REPLACE_THIS, REPLACE_WHERE, last_occurency ) > 0 DO

etc.


Esta modificación de la respuesta de Luist le permite a uno reemplazar la aguja con una versión con carcasa diferente de la aguja (dos líneas cambian).

DELIMITER | CREATE FUNCTION case_insensitive_replace ( REPLACE_WHERE text, REPLACE_THIS text, REPLACE_WITH text ) RETURNS text DETERMINISTIC BEGIN DECLARE last_occurency int DEFAULT ''1''; IF LENGTH(REPLACE_THIS) < 1 THEN RETURN REPLACE_WHERE; END IF; WHILE Locate( LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency ) > 0 DO BEGIN SET last_occurency = Locate(LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency); SET REPLACE_WHERE = Insert( REPLACE_WHERE, last_occurency, LENGTH(REPLACE_THIS), REPLACE_WITH); SET last_occurency = last_occurency + LENGTH(REPLACE_WITH); END; END WHILE; RETURN REPLACE_WHERE; END; | DELIMITER ;


Fui con http://pento.net/2009/02/15/case-insensitive-replace-for-mysql/ (en la respuesta de fvox) que realiza la búsqueda sin distinción entre mayúsculas y minúsculas y sin cambiar el caso de lo que debería ser ser caracteres no afectados en cualquier parte de la cadena buscada.

NB el comentario más abajo en la misma página que indica que CHAR (255) debería cambiarse a VARCHAR (255) - esto también parecía ser necesario para mí.


Función alternativa para uno hablado por fvox.

DELIMITER | CREATE FUNCTION case_insensitive_replace ( REPLACE_WHERE text, REPLACE_THIS text, REPLACE_WITH text ) RETURNS text DETERMINISTIC BEGIN DECLARE last_occurency int DEFAULT ''1''; IF LCASE(REPLACE_THIS) = LCASE(REPLACE_WITH) OR LENGTH(REPLACE_THIS) < 1 THEN RETURN REPLACE_WHERE; END IF; WHILE Locate( LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency ) > 0 DO BEGIN SET last_occurency = Locate(LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE)); SET REPLACE_WHERE = Insert( REPLACE_WHERE, last_occurency, LENGTH(REPLACE_THIS), REPLACE_WITH); SET last_occurency = last_occurency + LENGTH(REPLACE_WITH); END; END WHILE; RETURN REPLACE_WHERE; END; | DELIMITER ;

Pequeña prueba:

SET @str = BINARY ''New York''; SELECT case_insensitive_replace(@str, ''y'', ''K'');

Respuestas: New Kork


Mis 2 centavos.

Como muchas personas se han actualizado de MySQL a MariaDB, esas personas tendrán disponible una nueva función llamada REGEXP_REPLACE . Úselo como lo haría con un reemplazo normal, pero el patrón es una expresión regular.

Este es un ejemplo de trabajo:

UPDATE `myTable` SET `myField` = REGEXP_REPLACE(`myField`, ''(?i)my insensitive string'', ''new string'') WHERE `myField` REGEXP ''(?i)my insensitive string''

La opción (?i) hace que todas las coincidencias siguientes no sean sensibles a las mayúsculas y minúsculas (si se coloca al comienzo del patrón como lo hice, entonces todo es insensible).

Consulte aquí para obtener más información: https://mariadb.com/kb/en/mariadb/pcre/