Удалить специальные символы из поля базы данных - PullRequest
11 голосов
/ 20 мая 2011

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

Ответы [ 6 ]

22 голосов
/ 20 мая 2011
update mytable
set FieldName = REPLACE(FieldName,'/','')

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

5 голосов
/ 20 мая 2011

Функция Replace () является первым выбором. Тем не менее, специальные символы иногда сложно написать в консоли. Для тех, кого вы можете комбинировать Заменить с функцией Char ().

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

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

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

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

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

3 голосов
/ 06 марта 2018

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

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>
3 голосов
/ 29 июля 2013

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

Сначала вы должны знать набор символов базы данных и / или таблицы.Например, предположим, что у вас есть среда 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 в сочетании с функцией замены, скорее всего,выглядит следующим образом:

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

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

2 голосов
/ 04 апреля 2017

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

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 голос
/ 20 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...