阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL基本语法和SQL Server语法的差异小归纳

226次阅读
没有评论

共计 13790 个字符,预计需要花费 35 分钟才能阅读完成。

本文目录:
1. 和 SQL server 语法主要不同的地方
1.1 大小写敏感性
1.2 注释符
1.3 自增列
1.4 查看表的属性
1.5 修改表名
1.6 删除表
1.7 修改字段属性
1.8 添加、删除字段和约束
1.9 创建表模板
1.10 MySQL 中的字段显示宽度和 zerofill
2. 数据类型
3. 数据类型属性
3.1 unsigned
3.2 zerofill
4. 操作符
4.1 安全等于运算符(<=>)
4.2 正则表达式运算符(regexp 或者 rlike)
4.3 连接操作符
4.4 异或运算符 XOR
4.5 MySQL 中的转义

因为一早就接触过 SQL Server,所以对 SQL Server 的语法比较熟悉,后来转学 MySQL,还有些不适应,所以大致总结了一些 MySQL 和 SQL Server 语法不同的地方。

因为本文是 SQL Server 和 MySQL 语法差异性的总结,所以内容比较杂,没什么逻辑也不详细,还请见谅。在后面的文章中将只说明 MySQL 的语法。

 

1. 和 SQL Server 语法主要不同的地方

 

1.1 大小写敏感性

MySQL 和 SQL Server 一样,对大小写不敏感。但不同的是,在 MySQL 中对部分对象的引用是大小写敏感的,如数据库名、表名,但对字段、索引、函数、存储过程等的引用不敏感。

 

1.2 注释符

在 MySQL 中支持三种注释方法:以下都可以是行内注释。

  1. 使用 # 作为开头,后面的全是注释。
  2. 使用 -- 作为注释开头,但要注意,MySQL 中这种注释方法和 SQL Server 等其他标准数据库注释语法稍有不同,MySQL 要求第二个短线后面必须跟一个空白字符,如空格、制表符等。
  3. 使用 /**/ 注释符。

 

1.3 自增列

MySQL 中设置自增列 (auto_increment) 的列必须是 有索引的列,且创建表时要显式指定的种子值需要在建表语句之后。另外 MySQL 一张表只能有一个自增列。而 SQL Server 中可以有多个自增列。且 MySQL 中向自增列插入数据时必须使用 null 来表示插入的是自增列,除非显式指定插入列表中不包含自增列,而 SQL Server 向自增列插入数据时可以且必须无视该列,除非设置显示插入模式。

-- SQL Server 直接使用 identity,但必须有非自增列之外的列才能插入,除非显式开启手动插入自增列
create table emp1(id int not null identity(1,2),name CHAR(20));
insert into emp1 VALUES('malongshuai');
insert into emp1 values('gaoxiaofang');
select * from emp1; 

-- MySQL 中自增列必须为索引列,并且只能设置种子值而不能直接设置步长
create table emp1(id int not null primary key AUTO_INCREMENT);
create table emp2(id int not null primary key AUTO_INCREMENT) auto_increment=100;
insert into emp1 values(null);
insert into emp2 values(null);

设置自增列的步长,分为全局级别和会话级别。但它们都是临时生效的,重启实例后效果就消失,要永久生效可以将其写入配置文件中。如果是会话级别,那么当用户新建一个会话的时候,那么步长又回到了全局级别。

mysql 不能设置为表级别的步长!!

设置和查看全局和会话级别的变量时,分别使用如下语句:

set [session] auto_increment_increment=100;  -- 会话级的步长设置
set global auto_increment_offset=12;         -- 全局级的种子值
show [session] variables like 'auto_inc%';
show global variables like 'auto_inc%';

这两个变量都有 session 级和 global 级。其中 auto_increment_offset 项为起始计算项,auto_increment_increment 项为步长项。它们的处理模式和 SQL server 的处理方式相差甚远。当同时设置了这两个变量时,如果 offsert 设置的值大于 increment 的值,则 offset 将被忽略,且 MySQL 会以 ”offset+N\*increment” 计算下一条插入的记录值。例如,”offset=3、increment=5″,当前表的最后一个自增列值为 13,则下一条插入的自增值为 18,因为 ”offset+N\*increment” 将计算得到 [3,8,13,18,23,28…] 序列,所以从序列中挑出大于且最接近当前最后一个值 13 的项,即 18。

以上言论为官方手册上的解释 ( 原文:the next value inserted is the least value in the series that is greater than the maximum existing value in the AUTO_INCREMENT column),但实际上并不标准,更准确的说法是:根据当前 offset 和 increment 计算增长序列,并从中挑出大于或等于原序列的下一个值。例如上面 offset=3,生成的序列为[3,8,13,18,23…],下一个要插入的值为 18,但插入之前如果将 offset 改为 4,则新的序列为[4,9,14,19,24],那么它将插入 19,而不是 14,尽管 14 大于当前最后一个记录值 13。同理,如果将 offset 改小,例如设置为 2,则序列为[2,7,12,17,22],那么下一个插入的值将是 22。同理,修改 increment 也是一样计算的。

问:如果有一张表,里面有个字段为 id 的自增主键,当已经向表里面插入了 10 条数据之后,删除了 id 为 8、9、10 的数据,再把 mysql 重启,之后再插入一条数据,那么这条数据的 id 值应该是多少,是 8 还是 11?

答:是 11。但是在老版本中,innodb 存储引擎的表会是 8,这是 innodb 的 bug,在后来修复了,只是在 mysql5.6 中没有了。

查看当前自增值的方法:

show table status like "table_name_string";   -- 查看某个表的下一个自增值
select last_insert_id();   -- 查看当前环境下最后一次自增列的插入值

关于 ”last_insert_id” 函数,在下一篇文章 ” 内置函数 ” 中再做介绍。

 

1.4 查看表的属性

-- SQL Server 使用存储过程 sp_help
exec sp_help emp;

MySQL 基本语法和 SQL Server 语法的差异小归纳

-- MySQL 使用 desc 描述或者使用 show
mysql> desc emp1;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+

mysql> show table status like 'emp1'\G
*************************** 1. row ***************************
           Name: emp1
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 1
 Avg_row_length: 16384
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: 2
    Create_time: 2017-03-22 10:05:49
    Update_time: NULL
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

 

1.5 修改表名

-- SQL Server 使用存储过程 sp_rename
EXEC sp_rename emp,emp2 [object]

-- mysql 使用 alter 语句中的 rename 功能
alter table emp rename [to] emp3;

 

1.6 删除表

在删除表方面,MySQL 比 SQL Server 要方便很多,判断起来也方便很多。

-- SQL Server 删除表,每次只能删除一张表
if object_id('table_name') is not null drop table table_name;
if exists(select object_id('table_name')) drop table table_name;

-- MySQL 可以直接判断,且一次可以删除多表
drop table if exists table_name1,table_name2...

 

1.7 修改字段属性

-- SQL Server 只能修改字段属性(数据类型、空性),不能修改约束类属性,
-- 约束类属性需要使用 "alter table … add constraint"
alter table emp2 alter column id int not null;
alter table emp2 add gender char(2);
alter table emp2 add CONSTRAINT def_key DEFAULT('男') FOR gender;
alter table emp2 add constraint pk_key primary key clustered(id);

-- mysql 修改字段属性有几种方法
alter table table_name 
| ALTER [COLUMN] col_name {SET DEFAULT string | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name new_col_name column_definition
      [FIRST|AFTER col_name]
| MODIFY [COLUMN] col_name column_definition
      [FIRST | AFTER col_name]

也就是说,change 和 modify 都可以修改列的定义,包括约束类的属性、字段的位置,且 change 比 modify 更多一个重命名列的功能。而 alter column 则只能设置默认值和删除默认值。注意,重命名和修改字段时,需要重新定义字段属性。

 

1.8 添加、删除字段和约束

首先需要说明的是,MySQL 中任何存储引擎都不支持 check 约束,官方手册上说明了会对 check 语句进行读取检查,但是不会生效,也就是即使是对的 check 约束也是被忽略的。要在 MySQL 中实现 check 约束可以考虑使用触发器或者通过数据类型来限制。

-- MySQL 中添加、删除字段和约束的语法

-- 添加字段
| ADD [COLUMN] col_name column_definition
      [FIRST | AFTER col_name]
| ADD [COLUMN] (col_name column_definition,...)  -- 可以一次性添加多个字段
-- 删除字段
| DROP [COLUMN] col_name
-- 添加约束
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
    [index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)
      reference_definition
| ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name]
      [index_type] (index_col_name,...) [index_option] ...
-- 删除约束
| DROP PRIMARY KEY
| DROP FOREIGN KEY fk_symbol
| DROP {INDEX|KEY} index_name
| DISABLE KEYS
| ENABLE KEYS
-- 添加和删除默认值约束
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

对于 MariaDB,从 10.2.1 开始,其支持 DROP CONSTRAINT 子句,并引入了 DEFAULT 约束,还支持 check 约束。且在 MariaDB 10.0.2 版本之后,操作字段时甚至支持 if exists 和 if not exists。包括如下情况:

ADD COLUMN       [IF NOT EXISTS]
ADD INDEX        [IF NOT EXISTS]
ADD FOREIGN KEY  [IF NOT EXISTS]
ADD PARTITION    [IF NOT EXISTS]
CREATE INDEX     [IF NOT EXISTS]

DROP COLUMN      [IF EXISTS]
DROP INDEX       [IF EXISTS]
DROP FOREIGN KEY [IF EXISTS]
DROP PARTITION   [IF EXISTS]
CHANGE COLUMN    [IF EXISTS]
MODIFY COLUMN    [IF EXISTS]
DROP INDEX       [IF EXISTS]

对于 SQL Server,不管是什么约束,都能使用下面的语句进行删除,但 MySQL 有些麻烦,见下文具体说明:

alter table table_name drop constraint constraint_name
  1. 添加 / 删除字段

    -- SQL Server 添加字段,只能一个字段一个字段添加
    alter table emp add name char(20)
    -- MySQL 添加字段,可以一次添加一个字段,也可以一次添加多个字段
    ALTER TABLE emp ADD NAME CHAR(20) NOT NULL;
    ALTER TABLE emp ADD (gender CHAR(6) NOT NULL DEFAULT 'male',phone CHAR(11));
    
  2. 添加 / 删除主键、外键约束

    /* 添加主键约束 */
    -- SQL Server
    alter table emp10 add constraint pk_id primary key clustered(id);
    -- MySQL 添加主键
    ALTER TABLE emp10 ADD CONSTRAINT pk_id PRIMARY KEY (id);
    -- 添加外键约束,SQL Server 和 MySQL 相同
    ALTER TABLE emp10 ADD CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES emp20(id);
    -- MySQL 删除主键、外键(需要先删除外键)
    alter table emp10 drop foreign key fk_id;
    alter table emp10 drop primary key;
    

    MySQL 在外键上和 SQL Server 以及 Oracle 都不同,MySQL 在创建外键的时候,会自动在外键列上创建一个索引,且这个索引无法人为删除。在表联接的过程中因为会依赖性的对外表加上锁,如果外键列上没有索引,可能会加上表锁降低并发且容易导致死锁,如果有索引,将会进行范围锁定,增强并发性也减少了死锁的出现几率。在这一点上,MySQL 比 SQL Server 做的要好。

  3. 添加唯一性约束

    --SQL Server
    alter table emp10 add constraint uni_name unique nonclustered(name);
    -- MySQL 添加唯一性约束
    ALTER TABLE emp10 ADD CONSTRAINT uni_name UNIQUE KEY(`name`);
    -- MySQL 删除唯一性约束
    alter table emp10 drop key uni_name
    
  4. 默认值的设置方法
    SQL Server 的默认值约束和 MySQL 的默认值约束设置方法相差很大,MySQL 的默认值约束不能使用 constraint 来设置,只能通过修改列属性来设置。另外,MySQL 的 default 关键字后是不能加括号的,而 SQL Server 是无所谓的。

    -- SQL Server 设置默认值时可有可没有括号
    create table emp10(name int not null default(12));
    create table emp10(name int not null default 12);
    alter table emp10 add constraint def_name default 12 for name;
    -- MySQL 设置默认值时不能使用括号
    create table emp(id int not null default 12);
    alter table test.emp alter id set default 12;  /* 使用 change 和 modify 也行,但是要重定义列属性 */
    -- MySQL 删除默认值约束
    alter table test.emp alter id drop default;
    

 

1.9 创建表模板

-- SQL Server
select * into table_name1 from table_name2;             /* 复制表结构和数据 */
select * into table_name1 from table_name2 where 1=0;   /* 只复制表结构 */
-- MySQL
create table table_name1 like table_name2;              /* 只复制表结构 */
create tbale table_name1 as select * from table_name2;  /* 复制表结构和数据 */

MySQL 中复制表结构时不会复制主键、索引、自增列等任何属性,仅仅只是简单的建立一张表然后插入数据。但 SQL Server 复制表结构时会复制自增列属性。

 

1.10 MySQL 中的字段显示宽度和 zerofill

在 MySQL 中可以给整数数据类型指定结果的显式宽度,如 int(4)表示将显示 4 位整数,如果实际值的位数小于显示值宽度,则使用空格填充。而结果位数超出时将不影响显示结果。一般该功能都会配合 zerofill 属性用 0 代替空格填充,但是使用了 zerofill 后,该列就会自动变成无符号字段。

zerofill 属性的声明必须紧跟在整数数据类型的后面,而不能跟在如 not null 这样的属性后面。

SQL Server 中没有该功能。

要注意的是显示宽度和数据类型限制的字段宽度是不一样的。显示宽度不会影响字段的限制宽度,只是起一个显示作用。

CREATE TABLE test3(id INT(2) ZEROFILL NOT NULL);
ALTER TABLE test3 MODIFY id INT(2) ZEROFILL NOT NULL;
ALTER TABLE test3 CHANGE id id INT(2) ZEROFILL NOT NULL;
INSERT INTO test3 VALUES(1),(2),(11),(111);
SELECT id FROM test3;
+-----+
| id  |
+-----+
|  01 |
|  02 |
|  11 |
| 111 |
+-----+
4 rows in set (0.00 sec)

 

2. 数据类型

数据类型的范围是根据 bit 位的数量值来计算的。4 字节的 int 占用 32bit,所以可以表示的范围为 0 -2^32。
MySQL 基本语法和 SQL Server 语法的差异小归纳

数值在存储 (或调入内存) 时,以数值型方式存储比字符型或日期时间类型更节省空间。在整数值存储上,0-255 之间的任意整数都只占一个字节,256-65535 之间的任意整数都占 2 个字节,而占用 4 个字节时便可以代表几十亿个整数之间的任意一个,这显然比字符型存储时每个字符占用一个字节节省空间的多。例如值 ”100″ 存储为字符型时占用三个字节,而存储为数值型将只占用一个字节。因此数据库默认将不使用引号包围的值当作数值型,如果明确要存储为字符型或日期时间型则应该使用引号包围以避免歧义。

值          CHAR(4)    存储需求    VARCHAR(4)    存储需求
-----------------------------------------------------------
''          '    '     4个字节     ''            1个字节
'ab'        'ab'     4个字节     'ab'         3个字节
'abcd'      'abcd'     4个字节     'abcd'        5个字节
'abcdefgh'  'abcd'     4个字节     'abcd'        5个字节

MySQL 在 检索或操作 char 时会删除尾随空格 ,也就是说在 where 语句中name='gaoxiaofang'name='gaoxiaofang'的结果是一样的;若 name='gaoxiaofang',那么concat(name,'x') 的结果将是gaoxiaofangx

而检索或操作 varchar 时不会删除尾随空格。但是 char 类型的列和 varchar 类型的列进行比较会忽略尾随空格,即 char:a=varchar:a

mysql> create table test(a char(10),b varchar(10));
mysql> insert into test select 'a','a';
mysql> select concat(a,'x'),concat(b,'x'),a=b from test;
+---------------+---------------+-----+
| concat(a,'x') | concat(b,'x') | a=b |
+---------------+---------------+-----+
| ax            | a   x         |   1 |
+---------------+---------------+-----+
1 row in set

关于 char(M)和 varchar(M),其长度是 M 个字符(MySQL 早期版本是 M 字节),其字节数和字符集有关,例如 latain1 字符集下 char(30)表示能存储 30 个字符也就是 30 个字节,而 utf8 字符集下 char(30)只能存储 30 个字符(哪怕是英文字母),但该列将占用 30*3=90 个字节的空间。

mysql> create table test9(a char(2) charset utf8mb4,b char(2)) charset=latain1;
mysql> insert into test9 values('我是','wo'),('wo','wo');
mysql> select length(a),char_length(a),length(b),char_length(b) from test9;
+-----------+----------------+-----------+----------------+
| length(a) | char_length(a) | length(b) | char_length(b) |
+-----------+----------------+-----------+----------------+
|         6 |              2 |         2 |              2 |
|         2 |              2 |         2 |              2 |
+-----------+----------------+-----------+----------------+
2 rows in set (0.00 sec)'

varchar(M)的字节数还和存储的字节数有关,每 2^8 次方字节增加一字节结束符。

关于日期时间的输入方式是非常宽松的,以下几种方式都是被允许的:任意允许的分隔符,建议使用 4 位的年份。

2011-01-01 18:40:20
2011/01/01 18-40-20
20110101184020

对于 ENUM,插入数据时忽略大小写。如果 enum 列是允许 NULL 的,则 NULL 值也是有效值。

对于 SET 类型,和 enum 类似,不区分大小写,存储时删除尾随空格,null 也是有效值。但不同的是可以组合多个给出的值。如 set('a','b','c','d') 可以存储 'a,b','d,b' 等,多个成员之间使用逗号隔开。所以,使用多个成员的时候,成员本身的值中不能出现逗号。并且存储数据时忽略重复成员并按照枚举时的顺序存储,如 set('d','b','a'),存储'a,b,a','b,a,b' 的结果都是 'b,a'。使用find_in_set(set_value,set_column_name) 可以检索出包含指定 set 值 set_value 的行。

SELECT * FROM test6 WHERE FIND_IN_SET('d',col)>0;

 

3. 数据类型属性

 

3.1 unsigned

unsigned 属性就是让数值类型的数据变得无符号化。使用 unsigned 属性将会改变数值数据类型的范围,例如 tinyint 类型带符号的范围是 -128 到 127,而使用 unsigned 时范围将变成 0 到 255。同时 unsigned 也会限制该列不能插入负数值。

create table t(a int unsigned,b int unsigned);
insert into t select 1,2;
insert into t select -1,-2;

上面的语句中,在执行第二条语句准备插入负数时将会报错,提示超出范围。

使用 unsigned 在某些情况下确有其作用,例如一般的 ID 主键列不会允许使用负数,它相当于实现了一个 check 约束。

但是使用 unsigned 有时候也会出现些不可预料的问题:在进行数值运算时如果得到负数将会报错。例如上面的表 t 中,字段 a 和 b 都是无符号的列,且有一行 ”a=1,b=2″。

mysql> select * from t;
+---+---+
| a | b |
+---+---+
| 1 | 2 |
+---+---+
1 row in set

此时如果计算 ”a-b” 将会出错,不仅如此,只要是 unsigned 列参与计算并将得到负数都会出错。

mysql> select a-b from t;
1690 - BIGINT UNSIGNED value is out of range in '(`test`.`t`.`a` - `test`.`t`.`b`)'
mysql> select a-2 from t;
1690 - BIGINT UNSIGNED value is out of range in '(`test`.`t`.`a` - 2)'

而不是负数的结果将不会有影响。

mysql> select 2-a,a*3 from t;
+-----+-----+
| 2-a | a*3 |
+-----+-----+
|   1 |   3 |
+-----+-----+
1 row in set

这并不是 MySQL 中的 bug,在 C 语言中的 unsigned 也一样有类似的问题。这个问题在 MySQL 中设置 set sql_mode='no_unsigned_subtraction' 即可解决。

 

3.2 zerofill

zerofill 修饰字段后,不足字段显示部分将使用 0 来代替空格填充,启用 zerofill 后将自动设置 unsigned。zerofill 一般只在设置了列的显示宽度后一起使用。关于列的显示宽度在上文已经介绍过了。

mysql> create table t1(id int(4) zerofill);
mysql> select * from t1;
+-------+
| id    |
+-------+
|  0001 |
|  0002 |
|  0011 |
| 83838 |
+-------+
4 rows in set (0.00 sec)

zerofill 只是修饰显示结果,不会改变存储的数据值。

 

4. 操作符

只说明些 SQL Server 中没有的运算符。详细内容见官方手册:函数和操作符

 

4.1 安全等于运算符(<=>)

这个符号和 ”=” 进行相同的运算,但是它多出的一个功能是可以和 NULL 进行比较。

当比较的两边都是 NULL 时返回 1 而不是 NULL,只有一边是 null 时返回 0 而不是 null,其余的时候和 ”=” 的结果一样。

mysql> SELECT 1<=>NULL UNION ALL SELECT NULL<=>NULL UNION ALL SELECT 1=0 UNION ALL SELECT 1<=>0;
+----------+
| 1<=>NULL |
+----------+
|        0 |
|        1 |
|        0 |
|        0 |
+----------+
4 rows in set

 

4.2 正则表达式运算符(regexp 或者 rlike)

在 SQL Server 中没有正则表达式运算符,而 MySQL 中有。格式:expression regexp reg_pattern

若 expression 满足 reg_pattern,则返回 1,无法匹配成功则返回 0。若 expression 或 reg_pattern 任意一方为 null,则返回 null。

MySQL 实现的是扩展正则表达式。

mysql> SELECT 'basskd' REGEXP '^b','basskd' REGEXP 's.k','basskd' REGEXP NULL,NULL REGEXP '^b';
+----------------------+-----------------------+----------------------+------------------+
| 'basskd' REGEXP '^b' | 'basskd' REGEXP 's.k' | 'basskd' REGEXP NULL | NULL REGEXP '^b' |
+----------------------+-----------------------+----------------------+------------------+
|                    1 |                     1 | NULL                 | NULL             |
+----------------------+-----------------------+----------------------+------------------+
1 row in set

 

4.3 连接操作符

在 MySQL 中,”+” 不算是一种连接操作符。但是它的表达式是另有意义的:它会将两边的表达式尝试转换为数值型进行数值相加运算,如果转换失败的则表示为 0。

mysql> select '12'+'34',12+'34','abc'+12,'a'+'abc';
+-----------+---------+----------+-----------+
| '12'+'34' | 12+'34' | 'abc'+12 | 'a'+'abc' |
+-----------+---------+----------+-----------+
|        46 |      46 |       12 |         0 |
+-----------+---------+----------+-----------+
1 row in set

要真正实现字符串连接,需要使用函数 concat,这个将在下一篇文章的内置函数中介绍。

 

4.4 异或运算符 XOR

异或运算符是用于比较两边值是否相同的。相同则返回 0,不同则返回 1,如果存在 null,则直接返回 null。

mysql> select 1 xor 1,0 xor 0,1 xor 0,1 xor null,null xor null;
+---------+---------+---------+------------+---------------+
| 1 xor 1 | 0 xor 0 | 1 xor 0 | 1 xor null | null xor null |
+---------+---------+---------+------------+---------------+
|       0 |       0 |       1 | NULL       | NULL          |
+---------+---------+---------+------------+---------------+
1 row in set

XOR 运算符可以连接多次,顺序是从前向后依次进行运算。

mysql> select 1 xor 1 xor 0,1 xor 1 xor 1;
+---------------+---------------+
| 1 xor 1 xor 0 | 1 xor 1 xor 1 |
+---------------+---------------+
|             0 |             1 |
+---------------+---------------+
1 row in set

 

4.5 MySQL 中的转义

在 MySQL 中某些符号需要使用反斜杠 ”\” 来转义。包括单引号(‘)、双引号(“)、反斜线(\)。

另外,如果对象名使用了关键字或特殊符号,也需要进行转义,如列名使用了 int 关键字,表名使用了 char 关键字等。但是此时的转义符号不是反斜线,而是反引号 “ 或引号。

而在 SQL Server 中则不需要转义,有歧义的时候只需使用引号即可。

mysql> INSERT INTO test7 VALUES('\\'),('\\\\'),('\'');
mysql> select * from test7;
+-----+
| col |
+-----+
| \   |
| \\  |
| '   |
+-----+
3 rows in set

对于对象名的转义,参考 show create table table_name 的结果即可看到,处处使用了反引号防止歧义。例如:

mysql> show create table test7;
+-------+----------------------------------------------------------------------------+
| Table | Create Table                                                               |
+-------+----------------------------------------------------------------------------+
| test7 | CREATE TABLE `test7` (`col` char(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------+
1 row in set

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/148022.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计13790字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中