sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

 更新时间:2025年11月12日 11:41:36   作者:jackletter  
这篇文章主要介绍了sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符的相关资料,文中通过代码介绍的非常详细,对大家学习或者使用数据库具有一定的参考借鉴价值,需要的朋友可以参考下

一、转义符

一般我们在程序中使用反斜杠作为转义符,如下 c# 代码:

那么在sql中是不是也同样的规则呢?

在 SQL 标准 (ANSI SQL) 里:

  • 字符串常量使用单引号包裹,如果字符串本身有单引号则用两个单引号表示
  • 反斜杠 \ 不是转义字符

    我们甚至能在单引号里换行

那么讲完标准了,就看各个数据库的支持情况了:

1.1 oracle

支持

1.2 sqlserver

支持

1.3 postgresql

支持

1.4 sqlite

支持

1.5 mysql

默认不支持

如果我们开启 NO_BACKSLASH_ESCAPES 就能和sql标准一致了,如:

二、对象名称引用符

2.1 oracle

规则:

  • 只能用双引号包裹对象名并且对象名本身不能含有双引号
  • 双引号内反斜杠不是转义字符
  • 双引号内不接受换行(但接受制表符)

实例:

create table "test"(id int) -- 正常 test

create table "te\r\nst"(id int) -- te\r\nst
create table "te
st"(id int) 					   -- error 不能有换行符

CREATE TABLE "te""st123" (id INT); -- error 即使两个双引号也不行

2.2 postgresql

规则:

  • 只能用双引号包裹对象名,如果对象名本身有双引号,那么用两个代表一个
  • 双引号内反斜杠不是转义字符(普通的字符串都不是,更何况对象名)
  • 双引号内接受换行符、制表符等

实例:

create table "test"(id int,name varchar(50)) -- 正常 test

create table "te
ok
st"(id int,name varchar(50)) -- te换行符ok换行符st

create table "te\t\r\nst"(id int,name varchar(50)) -- te\t\r\nst

create table "te""ok"(id int) -- 两个双引号表示一个 te"ok

2.3 sqlserver

规则:接受双引号和中括号包裹对象名

  • 当使用双引号包裹对象名时:规则和postgresql一致

  • 当使用中括号包裹对象名时:

    • 外层中括号内除了右中括号都是普通字符(包括换行、制表、反斜杠等),直到遇到右中括号
    • 如果对象名本身含有左中括号,则直接写就行(被包含在了上一行的规则内)
    • 如果对象名本身含有右中括号,那么要用两个右中括号表示一个

实例:

-- 正常情况
create table [test](id int) -- test

-- 换行符会当成表名的一部分, 建好表后在ssms中完全看不出来, 只能用过下面的查询验证
create table [test
ok](id int) -- test换行符ok
select * from [test
ok]

-- 左侧第一个 '[' 认为是边界, 第二个认为是表名一部分, 最后一个认为是边界
create table [[test123](id int) -- [test123

-- 左侧第一个 '[' 认为是边界, 第二、三个认为是表名的一部分, 最后一个认为是边界
create table [[[test456](id int) -- [[test456

-- 左侧第一个 '[' 认为是边界, 第二、三、四个认为是表名的一部分, 最后一个认为是边界
create table [[[[test789](id int) -- [[[test789

-- 左侧第一个 '[' 认为是边界, 中间的 '[' 认为是表名一部分, 最后一个认为是边界
create table [te[st012](id int) -- te[st012

-- 左侧第一个 '[' 认为是边界, 中间的两个 '[' 认为是表名一部分, 最后一个认为是边界
create table [te[[st159](id int) -- te[[st159

-- 左侧第一个 '[' 认为是边界, 中间的 ']' 认为是结束边界, 所以报错
create table [te]st](id int) -- error

-- 左侧第一个 '[' 认为是边界, 中间的 ']]' 被当做一个 ']' 是表名一部分,最后一个认为是边界 
create table [te]]st247](id int) -- te]st247

-- 左侧第一个 '[' 认为是边界, 中间的 ']]' 被当做一个 ']' 是表名一部分,又紧接着出现的 ']' 认为是结束边界, 所以报错
create table [te]]]st](id int) -- error

-- 左侧第一个 '[' 认为是边界, 中间的 ']]]]' 被当做 ']]' 是表名一部分,最后一个认为是边界 
create table [te]]]]st358](id int) -- te]]st358

-- 左侧第一个 '[' 认为是边界, 中间的 ']]]]' 被当做 ']]' 是表名一部分,又紧接着出现的 ']' 认为是结束边界, 所以报错
create table [te]]]]]st](id int) -- error

-- 左侧第一个 '[' 认为是边界, 后面的 ']]' 被当做 ']' 是表名一部分,没有结束边界, 所以报错
create table [test]](id int) -- error

-- 左侧第一个 '[' 认为是边界, 后面的 ']]' 被当做 ']' 是表名一部分,最后一个认为是边界 
create table [test2468]]](id int) -- test2468]

-- 左侧第一个 '[' 认为是边界, 后面的 '[[[' 被当做 '[[[' 是表名一部分,后面的 ']]]]' 被当做 ']]' 是表名一部分, 最后一个是边界
create table [[[[test3579]]]]](id int) -- [[[test3579]]

2.4 mysql

规则:默认仅接受反引号包裹对象名

  • 用双引号包裹对象名,如果对象名本身有双引号,那么用两个代表一个
  • 双引号内反斜杠不是转义字符
  • 双引号内接受换行符、制表符等-

实例:

-- 正常情况
create table `test`(id int) -- test

create table `te\t\r\nst123`(id int) -- te\t\r\nst123
select * from `te\t\r\nst123`

-- 换行符会当成表名的一部分, 建好表后在 dbeaver 中完全看不出来, 只能用过下面的查询验证
create table `test
ok`(id int) -- test换行符ok
select * from `test
ok`

-- 第一个 '`' 是开始分割边界, 紧接着又一个 '`' 则认为是双 '`' 的第一个, 但没有又紧跟一个 '`' 报错
create table ``test`(id int) -- error

-- 第一个 '`' 是开始分割边界, 紧接着 '``' 被合并认为普通表名的 '`', 最后一个 '`' 结束分割边界
create table ```test123`(id int) -- `test123

-- 第一个 '`' 是开始分割边界, 结尾的 '``' 被合并认为普通表名的 '`', 这样就没有结束边界, 报错
create table `test``(id int) -- error

-- 第一个 '`' 是开始分割边界, 结尾的 '``' 被合并认为普通表名的 '`', 后面又跟了一个 '`' 结束分割边界
create table `test456```(id int) -- test456`

-- 第一个 '`' 是开始分割边界, 中间的 '`' 被认为是结束分割边界, 后面还有 就报错了
create table `test`ok`(id int) -- error

当mysql开启 ANSI_QUOTES 时,可以使用双引号,规则和 postgresql 一致

create table "t_user"(id int) -- 正常
create table "t\r\n_user123"(id int) -- 反斜杠不是转义符
create table "t""_user456"(id int) -- 两个双引号表示一个
create table "t
78_user456"(id int) -- 接受直接换行符

show tables

注意:mysql无论是用双引号还是反引号包裹对象名,内部反斜杠都不是转义符,这和 NO_BACKSLASH_ESCAPES 没关系

2.5 sqlite

规则:可以接受双引号、反引号、中括号三种形式包裹对象名,但推荐双引号

  • 当是双引号的时候和 postgresql 保持一致
  • 当是反引号的时候和mysql保持一致
  • 当是中括号的时候,除了对象名本身不能有右中括号外,和sqlserver一致

    sqlite这个比较特殊,看着像是兼容sqlserver,但实际解析有问题:
    如sql:create table [te]]st](id int,name varchar(50)) -- error 这在sqlsever中能正常执行

三、对象名称分几段

3.1 sqlserver

最多四段,如:[linked_db].[dbname].[schema].[table]

3.2 mysql

最多两段,如: dbname.table 也可以称为 schema.table

因为,mysql中没有像sqlserver那样额外的schema概念

3.3 postgresql

最多两段,如:"schema"."table"

postgresql中不能跨库查询,所以只能到schema,这个schema和sqlserver中的类似

3.4 sqlite

最多两段,如:"dbname"."table",但更常见的是一段,很少有两段的情况

因为sqlite是嵌入式的单文件,所以一般操作都在这个文件内都是一段,

但可以通过 attach 将另外几个文件附加进来,这样访问附件进来的数据就是两段了

3.5 oracle

最多有三段,如:"schema"."table"@dblink, 且最后一个 dblink 不能用双引号括起来

总结

到此这篇关于sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符的文章就介绍到这了,更多相关关系数据库对象名称和转义字符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Centos5.5中安装Mysql5.5过程分享

    Centos5.5中安装Mysql5.5过程分享

    这篇文章主要介绍了Centos5.5中安装Mysql5.5过程分享,本文使用编译方法安装MySQL,并给出了一些可能遇到的错误和解决方法,需要的朋友可以参考下
    2015-01-01
  • sql语句示例之case when作为where条件

    sql语句示例之case when作为where条件

    这篇文章主要给大家介绍了关于sql语句示例之case when作为where条件的相关资料,在SQL语句中CASE WHEN子句是根据条件表达式的结果来执行不同的逻辑操作,它使用在WHERE子句中,以根据特定的条件在查询结果中过滤数据,需要的朋友可以参考下
    2023-08-08
  • mac系统下mysql 8.0.11 安装指南

    mac系统下mysql 8.0.11 安装指南

    这篇文章主要为大家详细介绍了mac系统下mysql 8.0.11 安装指南,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • MySQL8.0 Command Line Client输入密码后出现闪退现象的原因以及解决方法总结

    MySQL8.0 Command Line Client输入密码后出现闪退现象的原因以及解决方法总结

    我们在安装MYSQL数据库时,经常会出现一些问题,下面这篇文章主要给大家介绍了关于MySQL8.0 Command Line Client输入密码后出现闪退现象的原因以及解决方法的相关资料,需要的朋友可以参考下
    2023-03-03
  • MySQL自动安装批处理脚本实例代码

    MySQL自动安装批处理脚本实例代码

    为了日后安装数据库方便,下面这篇文章主要给大家介绍了关于MySQL自动安装批处理脚本的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • mysql安装navicat之后,出现2059,Authentication plugin及本地链接虚拟机docker,远程链接服务器

    mysql安装navicat之后,出现2059,Authentication plugin及本地链接虚拟机docker,

    这篇文章主要介绍了mysql安装navicat之后,出现2059,Authentication plugin及本地链接虚拟机docker,远程链接服务器,需要的朋友可以参考下
    2020-06-06
  • MySQL创建带特殊字符的数据库名称方法示例

    MySQL创建带特殊字符的数据库名称方法示例

    这篇文章主要给大家介绍了MySQL创建带特殊字符的数据库名称方法,文中给出了详细的示例代码,需要的朋友可以参考学习,下面来一起看看吧。
    2017-03-03
  • MySQL进阶SELECT语法篇

    MySQL进阶SELECT语法篇

    从这个基本语法可以看出,最简单的SELECT语句是SELECT select_list,实际上利用这个最简单的SELECT语句,你也可以完成许多你期待的功能,首先你能利用它进行MySQL所支持的任何运算,例如:SELECT 1+1,它将返回2;其次,你也能利用它给变量赋值,而在PHP中,运用SELECT语句的这种功能,你就可以自由地运用MySQL的函数为PHP程序进行各种运算,并赋值给变量。在很多的时候,你会发现MySQL拥有许多比PHP更为功能强大的函数。
    2008-04-04
  • MySQL敏感数据加密的实现方案

    MySQL敏感数据加密的实现方案

    这篇文章主要介绍了MySQL敏感数据加密的实现方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2024-02-02
  • MySQL中查询json格式的字段实例详解

    MySQL中查询json格式的字段实例详解

    这篇文章主要给大家介绍了关于MySQL中查询json格式字段的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论