详细介绍:五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的对象名称和转义字符

news/2025/10/2 10:17:48/文章来源:https://www.cnblogs.com/tlnshuju/p/19123284

详细介绍:五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的对象名称和转义字符

2025-10-02 10:17  tlnshuju  阅读(0)  评论(0)    收藏  举报

一、转义符

一般我们在程序中使用反斜杠作为转义符,如下 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 不能用双引号括起来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

@RequestParam 什么时候可以省略?

参数名一致时 当HTTP请求中的参数名与控制器方法参数名完全一致时,@RequestParam可省略。 非必需参数 当请求参数为非必需(即允许未传递该参数时),可通过设置@RequestParam(required=false)或省略注解,此时即使未…

做全景效果图的网站wordpress适应ie6

《“爱读书”--给你讲技术》,我来看书,你来进步,让我们开始吧!本书简介书名为《轻量级JavaEE企业应用实战》,是本人在学习JavaEE框架的时候阅读的第一本书,本书对于框架及相关基础知识讲述的比较详细和浅显…

段页式管理方式

分段分页管理中最大的优缺点优点 缺点分页管理 内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片 不方便按照逻辑模块实现信息的共享和保护分段管理 很方便按照逻辑模块实现信息的共享和保护 如果段长过大,…

网站建设与单位干部作风的关系网站竞价推广都有哪些

有些粉丝,希望对自定义业务中,驳回到发起人进行处理,比如可以重新进行发起流程,下面就给出一种方式,当然不一定是最好的方式,只是提供一种参考而已,以后可以考虑动态根据流程状态或节点信息进行…

推进电子设计革新:为什么模拟仿真正是核心助力?

在高速发展的电子设计领域,模拟仿真已成为现代工程师的「得力助手」,它不仅能快速验证设计,还能显著提升流程效率与质量。1、仿真的三大优势:提前预见,精准优化,高效迭代 错误无处遁形 仿真能在设计实施前及时暴…

河北网站seo策划公司变更地址需要多少钱

T2-简单 MST题解 题意 设 ω ( x ) \omega(x) ω(x)为 x x x的质因数所构成的集合大小; 给两个正整数 l l l r r r,图上有 r − l 1 r-l1 r−l1个点,为 l , l 1 , l 2 , ⋯ , r − 2 , r − 1 , r l,l1,l2,\cdots,r-2,r-1,r l,l1,l2,…

网站域名 格式怎么做学校网站和微信公众号

日常工作中,经常会用到FTP,一般情况下,FTP站点在IE中(尤其是IE7以后版本)打开,默认都不是以文件夹视图方式打开的,这时IE也会给你提示“若要在 Windows 资源管理器中查看此 FTP 站点&#xff0c…

完整教程:深度解析ZStack Cloud v5.4.0 LTS 基础架构三大核心突破

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:精读C++20设计模式:结构型设计模式:装饰器模式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

*和 内存和地址 实例代码

#include <bits/stdc++.h> using namespace std; int main(){int number=42;int *ptr=&number;//ptr 存储 number 的地址 cout<<"变量值:"<<number<<endl; //42cout&l…

应用安全 --- 安卓加固 之 IPC

应用安全 --- 安卓加固 之 IPC应用安全 --- 安卓加固 之 IPC 会有一个调用者和被调用者,我们frida只能hook其中一个,无法获取全貌### 为什么看不到真实调用者信息?核心原因 :你看到的是一个 Binder IPC跨进程调用…

深入解析:前端开发,iframe 相关经验总结

深入解析:前端开发,iframe 相关经验总结pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

事业单位网站建设费入什么科目网站由谁备案

以下是一个使用DefaultsKit库的简单爬虫程序&#xff0c;用于爬取音频。代码中使用了https://www.duoip.cn/get_proxy的API获取代理服务器。 import Foundation import DefaultsKit ​ let url "https://www.douban.com/music" // 目标网站URL let proxyUrl "…

超市如何建立网站免费行情网站

文章目录 摘要Abstract文献阅读题目引言创新点方法利用长短期记忆网络学习时空演化特征构建用于气象辅助信息编码的堆叠自编码器使用多任务学习发现全市通用模式 模型实验数据集评估准则实验结果 深度学习Self-attentionself-Attention由来self-attention原理self attention代码…

寻找东莞微信网站建设三只松鼠软文范例500字

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

完整教程:Linux-01_2(vi / vim 编辑器)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

金华义乌网站建设企业建网站一般要多少钱

背景 在flink中&#xff0c;如果你想要访问记录的处理时间或者事件时间&#xff0c;注册定时器&#xff0c;或者是将记录输出到多个输出流中&#xff0c;你都需要处理函数的帮助&#xff0c;本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…

全面解析Umi-OCR手写体识别能力:开源OCR的新标杆 - 指南

全面解析Umi-OCR手写体识别能力:开源OCR的新标杆 - 指南2025-10-02 09:46 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important;…