У меня есть база данных с несколькими тысячами записей, и мне нужно разбить одно из полей, чтобы убедиться, что оно содержит только определенные символы (буквенно-цифровые, пробелы и одинарные кавычки). Какой 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;
- Оставьте только те символы, которые вам нужны:
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;