2011-05-20 28 views
8

Tengo una base de datos con varios miles de registros, y necesito quitar uno de los campos para asegurarme de que solo contiene ciertos caracteres (alfanuméricos, espacios y comillas simples). ¿Qué SQL puedo usar para quitar cualquier otro carácter (como barras, etc.) de ese campo en toda la base de datos?Eliminar caracteres especiales de un campo de base de datos

+0

Sólo hacer algunos cambios y nos e reemplazar. Varios miles de registros no son tantos ... ¡hombre arriba! – Hogan

Respuesta

20
update mytable 
set FieldName = REPLACE(FieldName,'/','') 

Ese es un buen lugar para comenzar.

+0

Esto lo hizo. Prefiero la expresión regular como menciona Rasika, pero este sitio está en un servidor compartido. – MarathonStudios

1

Eche un vistazo a LIB_MYSQLUDF_PREG que necesita compilarse en el servidor MySQL, pero tiene funciones avanzadas de expresión regular como preg_replace que le ayudarán con su tarea.

5

La función Reemplazar() es la primera opción. Sin embargo, los Caracteres Especiales a veces pueden ser difíciles de escribir en una consola. Para aquellos que puede combinar Reemplazar con la función Char().

p. Ej. la eliminación de €

Update products set description = replace(description, char(128), ''); 

Puede encontrar toda la Ascii values here

Lo ideal sería que usted podría hacer una expresión regular para encontrar todos los caracteres especiales, pero al parecer that's not possible with MySQL.

Más allá de eso, que había necesidad de ejecutar a través de su lenguaje de scripting favorito

3

Esto también puede ser útil.

Primero debe conocer el conjunto de caracteres de la base de datos y/o de la tabla. Por ejemplo, supongamos que tiene un entorno UTF-8 y desea quitar/quitar símbolos como símbolos registrados en un círculo, símbolo de copyright en un círculo y símbolo de marca registrada de un campo y luego buscar en Internet a través de Bing o Yahoo o Google para el valores de código hexadecimal de estos símbolos en el sistema de codificación UTF-8:

 
Symbol      Utf-8 Hex 
=======      ========= 
circled copyright    C2A9 
circled registered    C2AE 
Trademark (i.e., TM)   E284A2 

a continuación, el fregado seleccione SQL para la F1 de campo de la tabla t1, el uso de las instalaciones de hex/unhex en conjunción con la función de reemplazar, lo más probable es parecerse esto:

SELECT cast(unhex(replace(replace(replace(hex(f1),'C2A9',''),'C2AE',''),'E284A2','')) AS char) AS cleanf1 FROM t1 ;

arriba, tenga en cuenta el campo original para limpiar/limpiar es f1, la tabla es t1 y el encabezado de salida es cleanf1. El casting "como char" es necesario porque, sin él, el mysql 5.5.8 en el que he probado devuelve blob. Espero que esto ayude

1

Abundando en respuesta Vinnies ... se puede utilizar el siguiente (nótese el escape en los dos últimos estados ...

update table set column = REPLACE(column,"`",""); 
update table set column = REPLACE(column,"~",""); 
update table set column = REPLACE(column,"!",""); 
update table set column = REPLACE(column,"@",""); 
update table set column = REPLACE(column,"#",""); 
update table set column = REPLACE(column,"$",""); 
update table set column = REPLACE(column,"%",""); 
update table set column = REPLACE(column,"^",""); 
update table set column = REPLACE(column,"&",""); 
update table set column = REPLACE(column,"*",""); 
update table set column = REPLACE(column,"(",""); 
update table set column = REPLACE(column,")",""); 
update table set column = REPLACE(column,"-",""); 
update table set column = REPLACE(column,"_",""); 
update table set column = REPLACE(column,"=",""); 
update table set column = REPLACE(column,"+",""); 
update table set column = REPLACE(column,"{",""); 
update table set column = REPLACE(column,"}",""); 
update table set column = REPLACE(column,"[",""); 
update table set column = REPLACE(column,"]",""); 
update table set column = REPLACE(column,"|",""); 
update table set column = REPLACE(column,";",""); 
update table set column = REPLACE(column,":",""); 
update table set column = REPLACE(column,"'",""); 
update table set column = REPLACE(column,"<",""); 
update table set column = REPLACE(column,",",""); 
update table set column = REPLACE(column,">",""); 
update table set column = REPLACE(column,".",""); 
update table set column = REPLACE(column,"/",""); 
update table set column = REPLACE(column,"?",""); 
update table set column = REPLACE(column,"\\",""); 
update table set column = REPLACE(column,"\"",""); 
1

he creado función simple para este

DROP FUNCTION IF EXISTS `regex_replace`$$ 

CREATE FUNCTION `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original VARCHAR(1000)) RETURNS VARCHAR(1000) CHARSET utf8mb4 
    DETERMINISTIC 
BEGIN  
    DECLARE temp VARCHAR(1000); 
    DECLARE ch VARCHAR(1); 
    DECLARE i INT; 
    SET i = 1; 
    SET temp = ''; 
    IF original REGEXP pattern THEN 
     loop_label: LOOP 
      IF i>CHAR_LENGTH(original) THEN 
       LEAVE loop_label; 
      END IF; 

      SET ch = SUBSTRING(original,i,1); 

      IF NOT ch REGEXP pattern THEN 
       SET temp = CONCAT(temp,ch); 
      ELSE 
       SET temp = CONCAT(temp,replacement); 
      END IF; 

      SET i=i+1; 
     END LOOP; 
    ELSE 
     SET temp = original; 
    END IF; 

    RETURN temp; 
END 
ejemplo

Uso:

SELECT <field-name> AS NormalText, regex_replace('[^A-Za-z0-9 ]', '', <field-name>)AS RegexText FROM 
<table-name> 
Cuestiones relacionadas