Удаление специальных символов из поля базы данных

У меня есть база данных с несколькими тысячами записей, и мне нужно разбить одно из полей, чтобы убедиться, что оно содержит только определенные символы (буквенно-цифровые, пробелы и одинарные кавычки). Какой SQL я могу использовать для удаления любых других символов (таких как косые черты и т.д.) Из этого поля во всей базе данных?

Ответ 1

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

Это хорошее место для начала.

Ответ 2

Функция Replace() является первым выбором. Однако специальные символы иногда могут быть сложными для записи в консоли. Для них вы можете комбинировать Replace с помощью функции Char().

например. удаление €

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

Здесь вы можете найти все значения Ascii

В идеале вы можете сделать регулярное выражение, чтобы найти все специальные символы, но, по-видимому, что невозможно с MySQL.

Кроме того, вам нужно запустить его через ваш любимый язык сценариев.

Ответ 3

Это также может быть полезно.

Сначала вы должны знать набор символов базы данных и/или таблицы. Например, предположим, что у вас есть среда UTF-8, и вы хотите вырезать/удалить символы, такие как круговые зарегистрированные символы, обведенный символ авторского права и зарегистрированный символ товарного знака из поля, а затем искать в Интернете через bing или yahoo или google для шестнадцатеричные значения этих символов в системе UTF-8:

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

Затем ваша очистка выбирает sql для поля f1 из таблицы t1, используя средство hex/unhex в сочетании с функцией replace, скорее всего будет выглядеть следующим образом:

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

Выше обратите внимание, что исходное поле, которое нужно очистить/очистить, равно f1, таблица - t1, а выходной заголовок - cleanf1. Кастинг "как char" необходим, потому что, без него, mysql 5.5.8, на котором я тестировал, возвращает blob. Надеюсь, что это поможет

Ответ 4

Я создал простую функцию для этого

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

Пример использования:

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

Ответ 5

В ответ на ответ Vinnies... вы можете использовать следующее (обратите внимание на экранирование в двух последних утверждениях...

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,"\"","");

Ответ 6

Посмотрите LIB_MYSQLUDF_PREG, который необходимо скомпилировать на сервер MySQL, но имеет расширенные средства регулярного выражения, такие как preg_replace что поможет с вашей задачей.

Ответ 7

Моя версия MySQL не имеет REGEXP_REPLACE(). Я использовал следующие два обходных пути: 1. Удалите указанные символы (если вы знаете, какие символы вы хотите удалить)

    create function fn_remove_selected_characters
        (v_input_string varchar(255),
         v_unacceptable_characters varchar(255))
    RETURNS varchar(255)
    BEGIN

    -- declare variables
    declare i int;
    declare unacceptable_values varchar(255);
    declare this_character char(1);
    declare output_string varchar(255);
    declare input_length int;
    declare boolean_value int;
    declare space varchar(3);

    -- Set variable values
    set input_length = char_length(v_input_string);
    set i = 0;
    set unacceptable_values = v_unacceptable_characters;
    set output_string = '';
    set boolean_value = 0;
    set space = 'no';

    begin
    -- Leave spaces if they aren't in the exclude list
    if instr( unacceptable_values, ' ') = 0 then
        begin
        while i < input_length do
            SET this_character = SUBSTRING( v_input_string, i, 1 );
                -- If the current character is a space, 
                -- then concatenate a space to the output
                -- Although it seems redundant to explicitly add a space,
                -- SUBSTRING() equates a space to the empty string
                if this_character = ' ' then
                    set output_string = concat(output_string, ' ');
                -- if the current character is not a space, remove it if it unwanted
                elseif instr(unacceptable_values, this_character) then
                    set output_string = concat(output_string, '');
                -- otherwise include the character
                else set output_string = concat(output_string, this_character);
                end if;
            set i = i + 1;
        end while;
        end;
    else
        begin
        while i < input_length do
            begin
            SET this_character = SUBSTRING( v_input_string, i, 1 );
            if instr(unacceptable_values, this_character) > 0 then
                set output_string = concat(output_string, '');
            else set output_string = concat(output_string, this_character);
            end if;
            end;
            set i = i + 1;
        end while;
        end;
    end if;
    end;
        RETURN output_string;
  1. Оставьте только те символы, которые вам нужны:
    create function fn_preserve_selected_characters
        (v_input_string varchar(255),
         v_acceptable_characters varchar(255))
    returns varchar(255)

    begin
    declare i int;
    declare acceptable_values varchar(255);
    declare this_character char(1);
    declare output_string varchar(255);
    declare input_length int;
    declare boolean_value int;
    declare space varchar(3);

    set input_length = char_length(v_input_string);
    set i = 0;
    set acceptable_values = v_acceptable_characters;
    set output_string = '';
    set boolean_value = 0;
    set space = 'no';

    begin

    -- check for existence of spaces
    if instr( acceptable_values, ' ') then
        begin
        while i < input_length do
            -- SUBSTRING() treats spaces as empty strings
            -- so handle them specially
            SET this_character = SUBSTRING( v_input_string, i, 1 );
                if this_character = ' ' then
                    set output_string = concat(output_string, ' ');
                elseif instr(acceptable_values, this_character) then
                    set output_string = concat(output_string, this_character);
                else set output_string = concat(output_string, '');
                end if;
            set i = i + 1;
        end while;
        end;
    -- if there are no spaces in input string
    -- then this section is complete
    else 
        begin
        while i <= input_length do
            SET this_character = SUBSTRING( v_input_string, i, 1 );
            -- if the current character exists in the punctuation string
            if LOCATE( this_character, acceptable_values ) > 0 THEN
                set output_string = concat(output_string, this_character);
            end if;
            set i = i+1;
        end while;
        end;
    end if;
    end;
        RETURN output_string;