MySQL 和达梦(DM)中处理包含 $
等特殊字符的插入语句时,需要根据字符的用途(作为列名、值或转义字符)采取不同的处理方式。以下是详细说明:
一、特殊字符作为值的一部分
1. 普通字符串值(包含 $
)
若 $
是值的一部分(如密码、金额),直接使用单引号包裹即可,无需额外转义。
MySQL
sql
INSERT INTO users (username, password) VALUES ('alice', 'pass$word123');
达梦(DM)
语法相同:
sql
INSERT INTO users (username, password) VALUES ('alice', 'pass$word123');
2. 需要转义的特殊字符
若值中包含单引号 '
,需使用双单引号 ''
转义(或使用预处理语句)。
示例:包含单引号的值
sql
-- MySQL 和达梦均支持
INSERT INTO comments (content) VALUES ('It''s a nice day!');
二、特殊字符作为列名或表名
若表名或列名包含 $
等特殊字符,需使用标识符引用符:
1. MySQL
使用反引号 `
:
sql
INSERT INTO `table$name` (`col$1`, `col$2`) VALUES ('value1', 'value2');
2. 达梦(DM)
使用双引号 "
(兼容 SQL 标准和 Oracle 风格):
sql
INSERT INTO "table$name" ("col$1", "col$2") VALUES ('value1', 'value2');
三、特殊字符在函数或表达式中
1. 正则表达式(包含 $
)
-
MySQL:使用
REGEXP
,$
表示行尾。sql
-- 插入以 .com 结尾的邮箱 INSERT INTO users (email) VALUES ('test@example.com') WHERE 'test@example.com' REGEXP '\\.com$'; -- $ 需转义为 \\$
-
达梦:使用
REGEXP_LIKE
(兼容 Oracle),$
直接使用:sql
INSERT INTO users (email) VALUES ('test@example.com') WHERE REGEXP_LIKE('test@example.com', '\\.com$'); -- 无需额外转义
2. 变量(包含 $
)
- MySQL:用户变量以
@
开头,如@var
。 - 达梦:使用
VARIABLE
声明变量,无需$
。
四、预处理语句(推荐方法)
对于包含复杂特殊字符的值,推荐使用预处理语句(Prepared Statements),可自动处理转义,避免 SQL 注入。
1. MySQL(使用 ?
占位符)
sql
PREPARE stmt FROM 'INSERT INTO users (username, password) VALUES (?, ?)';
SET @username = 'user$name';
SET @password = 'pass$word';
EXECUTE stmt USING @username, @password;
2. 达梦(使用 :1
、:2
占位符)
sql
-- 达梦支持类似 Oracle 的绑定变量
DECLARE
v_username VARCHAR(50) := 'user$name';
v_password VARCHAR(50) := 'pass$word';
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO users (username, password) VALUES (:1, :2)'
USING v_username, v_password;
END;
五、特殊场景:存储过程 / 函数中的 $
1. MySQL
若存储过程中使用 $
作为分隔符,需用 DELIMITER
声明:
sql
DELIMITER $$
CREATE PROCEDURE test()
BEGIN
INSERT INTO users VALUES ('user$');
END$$
DELIMITER ;
2. 达梦
存储过程使用 IS
/AS
声明,无需特殊分隔符:
sql
CREATE OR REPLACE PROCEDURE test()
IS
BEGIN
INSERT INTO users VALUES ('user$');
END;
总结:MySQL vs 达梦的差异
场景 | MySQL | 达梦(DM) |
---|---|---|
值包含 $ | 直接使用单引号包裹 | 同 MySQL |
列名 / 表名包含 $ | 使用反引号 ` | 使用双引号 " |
正则表达式中的 $ | 需转义为 \\$ | 直接使用 $ |
预处理语句占位符 | ? | :1 , :2 |
存储过程分隔符 | DELIMITER $$ | 无需特殊分隔符 |
建议
- 优先使用预处理语句:可自动处理所有特殊字符,安全性更高。
- 明确字符用途:区分
$
是作为值、列名还是语法符号。 - 迁移注意事项:从 MySQL 迁移到达梦时,需将反引号
`
替换为双引号"
。