Как удалить все не буквенно-цифровые символы из строки в MySQL? - PullRequest
55 голосов
/ 04 августа 2011

Я работаю над процедурой, которая сравнивает строки, но для большей эффективности мне нужно удалить все символы, которые не являются буквами или цифрами.

Я сейчас использую несколько REPLACE функций, но, может быть, есть более быстрое и приятное решение?

Ответы [ 17 ]

1 голос
/ 20 марта 2014

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

update pages set slug = lower(replace(replace(replace(replace(name, ' ', ''), '-', ''), '.', ''), '&', '')); # replacing just space, -, ., & only

.

Это только рекомендуется для известного набора данных, в противном случае это тривиально для некоторых специальных символов, чтобы ускользнуть с Подход черного списка вместо подхода белого списка.

Очевидно, что самым простым способом является предварительная проверка данных за пределами SQL из-за отсутствия надежного встроенного белого списка (например, с помощью замены регулярных выражений).

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

если вы используете php, то ....

try{
$con = new PDO ("mysql:host=localhost;dbname=dbasename","root","");
}
catch(PDOException $e){
echo "error".$e-getMessage();   
}

$select = $con->prepare("SELECT * FROM table");
$select->setFetchMode(PDO::FETCH_ASSOC);
$select->execute();

while($data=$select->fetch()){ 

$id = $data['id'];
$column = $data['column'];
$column = preg_replace("/[^a-zA-Z0-9]+/", " ", $column); //remove all special characters

$update = $con->prepare("UPDATE table SET column=:column WHERE id='$id'");
$update->bindParam(':column', $column );
$update->execute();

// echo $column."<br>";
} 
0 голосов
/ 25 февраля 2016

Я попробовал несколько решений, но в конце использовал replace. Мой набор данных - это номера деталей, и я точно знаю, чего ожидать. Но для здравого смысла я использовал PHP для построения длинного запроса:

$dirty = array(' ', '-', '.', ',', ':', '?', '/', '!', '&', '@');
$query = 'part_no';
foreach ($dirty as $dirt) {
    $query = "replace($query,'$dirt','')";
}
echo $query;

Это выводит то, что я использовал, чтобы получить головную боль от:

replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(part_no,' ',''),'-',''),'.',''),',',''),':',''),'?',''),'/',''),'!',''),'&',''),'@','')
0 голосов
/ 20 марта 2014

Вероятно, глупое предложение по сравнению с другими:

if(!preg_match("/^[a-zA-Z0-9]$/",$string)){
    $sortedString=preg_replace("/^[a-zA-Z0-9]+$/","",$string);
}
0 голосов
/ 05 апреля 2017

функция alphanum (автоответчик) содержит ошибку, но я не знаю почему. Для текста "cas synt ls 75W140 1L" верните "cassyntls75W1401", в конце буквы "L" не хватает как.

Теперь я использую

delimiter //
DROP FUNCTION IF EXISTS alphanum //
CREATE FUNCTION alphanum(prm_strInput varchar(255))
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE v_char VARCHAR(1);
  DECLARE v_parseStr VARCHAR(255) DEFAULT ' ';
WHILE (i <= LENGTH(prm_strInput) )  DO
  SET v_char = SUBSTR(prm_strInput,i,1);
  IF v_char REGEXP  '^[A-Za-z0-9]+$' THEN 
        SET v_parseStr = CONCAT(v_parseStr,v_char);  
  END IF;
  SET i = i + 1;
END WHILE;
RETURN trim(v_parseStr);
END
//

(найдено в Google)

0 голосов
/ 04 апреля 2018

Необходимо заменить не буквенно-цифровые символы вместо удаления не буквенно-цифровых символов, поэтому я создал это на основе алфавита Райана Шиллингтона. Работает для строк длиной до 255 символов

DROP FUNCTION IF EXISTS alphanumreplace; 
DELIMITER | 
CREATE FUNCTION alphanumreplace( str CHAR(255), d CHAR(32) ) RETURNS CHAR(255) 
BEGIN 
  DECLARE i, len SMALLINT DEFAULT 1; 
  DECLARE ret CHAR(32) DEFAULT ''; 
  DECLARE c CHAR(1); 
  SET len = CHAR_LENGTH( str ); 
  REPEAT 
    BEGIN 
      SET c = MID( str, i, 1 ); 
      IF c REGEXP '[[:alnum:]]' THEN SET ret=CONCAT(ret,c); 
      ELSE SET ret=CONCAT(ret,d);
      END IF; 
      SET i = i + 1; 
    END; 
  UNTIL i > len END REPEAT; 
  RETURN ret; 
END | 
DELIMITER ; 

Пример:

select 'hello world!',alphanum('hello world!'),alphanumreplace('hello world!','-');
+--------------+--------------------------+-------------------------------------+
| hello world! | alphanum('hello world!') | alphanumreplace('hello world!','-') |
+--------------+--------------------------+-------------------------------------+
| hello world! | helloworld               | hello-world-                        |
+--------------+--------------------------+-------------------------------------+

Вам нужно отдельно добавить функцию alphanum, если вы этого хотите, я просто привожу ее здесь для примера.

0 голосов
/ 31 марта 2015

Мне нужно было получить только буквенные символы строки в процедуре, и я сделал:

SET @source = "whatever you want";
SET @target = '';
SET @i = 1;
SET @len = LENGTH(@source);
WHILE @i <= @len DO
    SET @char = SUBSTRING(@source, @i, 1);
    IF ((ORD(@char) >= 65 && ORD(@char) <= 90) || (ORD(@char) >= 97 && ORD(@char) <= 122)) THEN
        SET @target = CONCAT(@target, @char);
    END IF;
    SET @i = @i + 1;
END WHILE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...