inert into table 如果有$等特殊字符mysql 和达梦sql语句的区别

 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 $$无需特殊分隔符

建议

  1. 优先使用预处理语句:可自动处理所有特殊字符,安全性更高。
  2. 明确字符用途:区分 $ 是作为值、列名还是语法符号。
  3. 迁移注意事项:从 MySQL 迁移到达梦时,需将反引号 ` 替换为双引号 "

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三希

如果这篇文章帮您解决了技术难题

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值