Mar*_*ios 12 mysql sql database
我有一个包含数千条记录的数据库,我需要删除其中一个字段以确保它只包含某些字符(字母数字,空格和单引号).我可以使用什么SQL从整个数据库中的该字段中去除任何其他字符(例如斜杠等)?
Vin*_*nie 23
update mytable
set FieldName = REPLACE(FieldName,'/','')
Run Code Online (Sandbox Code Playgroud)
这是一个很好的起点.
这可能有用。
\n此解决方案不涉及创建过程或函数,也不涉及在替换中长时间使用替换。相反,我们知道所有不涉及特殊字符的 ASCII 字符都位于 ASCII 代码 \\x20-\\x7E(十六进制表示)内。来源\n ASCII 来自免费百科全书维基百科下面是该区间中的所有字符。
\nHex: 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所以简单的正则表达式替换就可以完成这项工作
\nSELECT REGEXP_REPLACE(columnName, \'[^\\\\x20-\\\\x7E]\', \'\') from tableName;\n
Run Code Online (Sandbox Code Playgroud)\nPHP自定义查询字符串
\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”。
\nPS:如果您正在存储过程中使用准备语句或通过 PHP(创建自定义查询字符串)执行任何 DML(选择、更新...)操作;然后记得转义斜杠 ie
\nSET @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我为此创建了简单的函数
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)