从数据库字段中删除特殊字符

Mar*_*ios 12 mysql sql database

我有一个包含数千条记录的数据库,我需要删除其中一个字段以确保它只包含某些字符(字母数字,空格和单引号).我可以使用什么SQL从整个数据库中的该字段中去除任何其他字符(例如斜杠等)?

Vin*_*nie 23

update mytable
set FieldName = REPLACE(FieldName,'/','')
Run Code Online (Sandbox Code Playgroud)

这是一个很好的起点.


Ade*_*emi 7

这可能有用。

\n

此解决方案不涉及创建过程或函数,也不涉及在替换中长时间使用替换。相反,我们知道所有不涉及特殊字符的 ASCII 字符都位于 ASCII 代码 \\x20-\\x7E(十六进制表示)内。来源\n ASCII 来自免费百科全书维基百科下面是该区间中的所有字符。

\n
Hex: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E\nGlyph: \xc2\xa0space ! " # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] \xe2\x86\x91 \xe2\x86\x90 @ a b c d e f g h i j k l m n o p q r s t u v w x y z { ACK } ESC\n
Run Code Online (Sandbox Code Playgroud)\n

所以简单的正则表达式替换就可以完成这项工作

\n
SELECT REGEXP_REPLACE(columnName, \'[^\\\\x20-\\\\x7E]\', \'\') from tableName;\n
Run Code Online (Sandbox Code Playgroud)\n

PHP自定义查询字符串

\n
$query = "select REGEXP_REPLACE(columnName, \'(.*)[(].*[)](.*)\', CONCAT(\'\\\\\\\\1\', \'\\\\\\\\2\')) `Alias` FROM table_Name";\n
Run Code Online (Sandbox Code Playgroud)\n

上述语句替换了括号内的内容以及括号内的内容。例如,如果该列包含“Staff Oreintation (CMST TOT)”,则上述语句将删除括号及其内容,即“Staff Oreintation”。

\n

PS:如果您正在存储过程中使用准备语句或通过 PHP(创建自定义查询字符串)执行任何 DML(选择、更新...)操作;然后记得转义斜杠 ie

\n
SET @sql = CONCAT("SELECT REGEXP_REPLACE(columnName, \'[^\\\\\\\\x20-\\\\\\\\x7E]\', \'\') from tableName");\nPREPARE stmt FROM @sql;\nEXECUTE stmt;\nDEALLOCATE PREPARE stmt;\n
Run Code Online (Sandbox Code Playgroud)\n

上面的 SQL 语句执行一个简单的正则表达式替换(实际上删除)所有特殊字符;即在 SQL 中,REGEX 模式提到了所有要替换为空的特殊字符。

\n

模式解释

\n

字符组以方括号开始。第一个字符是插入符号,其含义是;组中提到的所有字符的否定(即方括号中的)。这仅仅意味着选择组中所有角色的赞美(除所选角色之外的其他角色)。

\n

只是总结一下上面的陈述

\n

仅供参考:请记住 Enter(换行符 \\n 0A、回车符 \\r 0D)、Tab(水平制表符 \\t 09、垂直制表符 \\v 0B)不是可打印字符,但有时很重要;因此,如果您希望排除它们,也可以添加它们。IE

\n
[^\\x20-\\x7E\\x0A\\x0D\\x09\\x0B]\n
Run Code Online (Sandbox Code Playgroud)\n

不变:所有字母数字字符、标点符号字符、算术运算符。

\n

删除所有 Unicode 字符(拉丁字母除外)或特殊字符。

\n


Jun*_*ari 6

我为此创建了简单的函数

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
Run Code Online (Sandbox Code Playgroud)

用法示例:

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

  • 请提供该功能:) (2认同)

小智 5

Replace()函数是第一选择.但是,在控制台中编写特殊字符有时会很棘手.对于那些你可以组合替换与Char()函数.

例如,删除€

Update products set description = replace(description, char(128), '');
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到所有Ascii值

理想情况下,您可以使用正则表达式来查找所有特殊字符,但显然这对MySQL来说是不可能的.

除此之外,您需要通过您喜欢的脚本语言来运行它.