sqlserver、mysql、oracle、pgsql、sqlite五大關(guān)系數(shù)據(jù)庫的對象名稱和轉(zhuǎn)義字符
一、轉(zhuǎn)義符
一般我們在程序中使用反斜杠作為轉(zhuǎn)義符,如下 c# 代碼:

那么在sql中是不是也同樣的規(guī)則呢?
在 SQL 標(biāo)準(zhǔn) (ANSI SQL) 里:
- 字符串常量使用單引號包裹,如果字符串本身有單引號則用兩個(gè)單引號表示
- 反斜杠 \ 不是轉(zhuǎn)義字符
我們甚至能在單引號里換行
那么講完標(biāo)準(zhǔn)了,就看各個(gè)數(shù)據(jù)庫的支持情況了:
1.1 oracle
支持

1.2 sqlserver
支持

1.3 postgresql
支持

1.4 sqlite
支持

1.5 mysql
默認(rèn)不支持

如果我們開啟 NO_BACKSLASH_ESCAPES 就能和sql標(biāo)準(zhǔn)一致了,如:

二、對象名稱引用符
2.1 oracle
規(guī)則:
- 只能用雙引號包裹對象名并且對象名本身不能含有雙引號
- 雙引號內(nèi)反斜杠不是轉(zhuǎn)義字符
- 雙引號內(nèi)不接受換行(但接受制表符)
實(shí)例:
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 即使兩個(gè)雙引號也不行
2.2 postgresql
規(guī)則:
- 只能用雙引號包裹對象名,如果對象名本身有雙引號,那么用兩個(gè)代表一個(gè)
- 雙引號內(nèi)反斜杠不是轉(zhuǎn)義字符(普通的字符串都不是,更何況對象名)
- 雙引號內(nèi)接受換行符、制表符等
實(shí)例:
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) -- 兩個(gè)雙引號表示一個(gè) te"ok
2.3 sqlserver
規(guī)則:接受雙引號和中括號包裹對象名
當(dāng)使用雙引號包裹對象名時(shí):規(guī)則和postgresql一致
當(dāng)使用中括號包裹對象名時(shí):
- 外層中括號內(nèi)除了右中括號都是普通字符(包括換行、制表、反斜杠等),直到遇到右中括號
- 如果對象名本身含有左中括號,則直接寫就行(被包含在了上一行的規(guī)則內(nèi))
- 如果對象名本身含有右中括號,那么要用兩個(gè)右中括號表示一個(gè)
實(shí)例:
-- 正常情況 create table [test](id int) -- test -- 換行符會(huì)當(dāng)成表名的一部分, 建好表后在ssms中完全看不出來, 只能用過下面的查詢驗(yàn)證 create table [test ok](id int) -- test換行符ok select * from [test ok] -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 第二個(gè)認(rèn)為是表名一部分, 最后一個(gè)認(rèn)為是邊界 create table [[test123](id int) -- [test123 -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 第二、三個(gè)認(rèn)為是表名的一部分, 最后一個(gè)認(rèn)為是邊界 create table [[[test456](id int) -- [[test456 -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 第二、三、四個(gè)認(rèn)為是表名的一部分, 最后一個(gè)認(rèn)為是邊界 create table [[[[test789](id int) -- [[[test789 -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 中間的 '[' 認(rèn)為是表名一部分, 最后一個(gè)認(rèn)為是邊界 create table [te[st012](id int) -- te[st012 -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 中間的兩個(gè) '[' 認(rèn)為是表名一部分, 最后一個(gè)認(rèn)為是邊界 create table [te[[st159](id int) -- te[[st159 -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 中間的 ']' 認(rèn)為是結(jié)束邊界, 所以報(bào)錯(cuò) create table [te]st](id int) -- error -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 中間的 ']]' 被當(dāng)做一個(gè) ']' 是表名一部分,最后一個(gè)認(rèn)為是邊界 create table [te]]st247](id int) -- te]st247 -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 中間的 ']]' 被當(dāng)做一個(gè) ']' 是表名一部分,又緊接著出現(xiàn)的 ']' 認(rèn)為是結(jié)束邊界, 所以報(bào)錯(cuò) create table [te]]]st](id int) -- error -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 中間的 ']]]]' 被當(dāng)做 ']]' 是表名一部分,最后一個(gè)認(rèn)為是邊界 create table [te]]]]st358](id int) -- te]]st358 -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 中間的 ']]]]' 被當(dāng)做 ']]' 是表名一部分,又緊接著出現(xiàn)的 ']' 認(rèn)為是結(jié)束邊界, 所以報(bào)錯(cuò) create table [te]]]]]st](id int) -- error -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 后面的 ']]' 被當(dāng)做 ']' 是表名一部分,沒有結(jié)束邊界, 所以報(bào)錯(cuò) create table [test]](id int) -- error -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 后面的 ']]' 被當(dāng)做 ']' 是表名一部分,最后一個(gè)認(rèn)為是邊界 create table [test2468]]](id int) -- test2468] -- 左側(cè)第一個(gè) '[' 認(rèn)為是邊界, 后面的 '[[[' 被當(dāng)做 '[[[' 是表名一部分,后面的 ']]]]' 被當(dāng)做 ']]' 是表名一部分, 最后一個(gè)是邊界 create table [[[[test3579]]]]](id int) -- [[[test3579]]
2.4 mysql
規(guī)則:默認(rèn)僅接受反引號包裹對象名
- 用雙引號包裹對象名,如果對象名本身有雙引號,那么用兩個(gè)代表一個(gè)
- 雙引號內(nèi)反斜杠不是轉(zhuǎn)義字符
- 雙引號內(nèi)接受換行符、制表符等-
實(shí)例:
-- 正常情況 create table `test`(id int) -- test create table `te\t\r\nst123`(id int) -- te\t\r\nst123 select * from `te\t\r\nst123` -- 換行符會(huì)當(dāng)成表名的一部分, 建好表后在 dbeaver 中完全看不出來, 只能用過下面的查詢驗(yàn)證 create table `test ok`(id int) -- test換行符ok select * from `test ok` -- 第一個(gè) '`' 是開始分割邊界, 緊接著又一個(gè) '`' 則認(rèn)為是雙 '`' 的第一個(gè), 但沒有又緊跟一個(gè) '`' 報(bào)錯(cuò) create table ``test`(id int) -- error -- 第一個(gè) '`' 是開始分割邊界, 緊接著 '``' 被合并認(rèn)為普通表名的 '`', 最后一個(gè) '`' 結(jié)束分割邊界 create table ```test123`(id int) -- `test123 -- 第一個(gè) '`' 是開始分割邊界, 結(jié)尾的 '``' 被合并認(rèn)為普通表名的 '`', 這樣就沒有結(jié)束邊界, 報(bào)錯(cuò) create table `test``(id int) -- error -- 第一個(gè) '`' 是開始分割邊界, 結(jié)尾的 '``' 被合并認(rèn)為普通表名的 '`', 后面又跟了一個(gè) '`' 結(jié)束分割邊界 create table `test456```(id int) -- test456` -- 第一個(gè) '`' 是開始分割邊界, 中間的 '`' 被認(rèn)為是結(jié)束分割邊界, 后面還有 就報(bào)錯(cuò)了 create table `test`ok`(id int) -- error
當(dāng)mysql開啟 ANSI_QUOTES 時(shí),可以使用雙引號,規(guī)則和 postgresql 一致
create table "t_user"(id int) -- 正常 create table "t\r\n_user123"(id int) -- 反斜杠不是轉(zhuǎn)義符 create table "t""_user456"(id int) -- 兩個(gè)雙引號表示一個(gè) create table "t 78_user456"(id int) -- 接受直接換行符 show tables

注意:mysql無論是用雙引號還是反引號包裹對象名,內(nèi)部反斜杠都不是轉(zhuǎn)義符,這和
NO_BACKSLASH_ESCAPES沒關(guān)系
2.5 sqlite
規(guī)則:可以接受雙引號、反引號、中括號三種形式包裹對象名,但推薦雙引號
- 當(dāng)是雙引號的時(shí)候和 postgresql 保持一致
- 當(dāng)是反引號的時(shí)候和mysql保持一致
- 當(dāng)是中括號的時(shí)候,除了對象名本身不能有右中括號外,和sqlserver一致
sqlite這個(gè)比較特殊,看著像是兼容sqlserver,但實(shí)際解析有問題:
如sql:create table [te]]st](id int,name varchar(50)) -- error這在sqlsever中能正常執(zhí)行
三、對象名稱分幾段
3.1 sqlserver
最多四段,如:[linked_db].[dbname].[schema].[table]
3.2 mysql
最多兩段,如: dbname.table 也可以稱為 schema.table
因?yàn)椋琺ysql中沒有像sqlserver那樣額外的schema概念
3.3 postgresql
最多兩段,如:"schema"."table"
postgresql中不能跨庫查詢,所以只能到schema,這個(gè)schema和sqlserver中的類似
3.4 sqlite
最多兩段,如:"dbname"."table",但更常見的是一段,很少有兩段的情況
因?yàn)閟qlite是嵌入式的單文件,所以一般操作都在這個(gè)文件內(nèi)都是一段,
但可以通過 attach 將另外幾個(gè)文件附加進(jìn)來,這樣訪問附件進(jìn)來的數(shù)據(jù)就是兩段了
3.5 oracle
最多有三段,如:"schema"."table"@dblink, 且最后一個(gè) dblink 不能用雙引號括起來
總結(jié)
到此這篇關(guān)于sqlserver、mysql、oracle、pgsql、sqlite五大關(guān)系數(shù)據(jù)庫的對象名稱和轉(zhuǎn)義字符的文章就介紹到這了,更多相關(guān)關(guān)系數(shù)據(jù)庫對象名稱和轉(zhuǎn)義字符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux下mysql5.6.24(二進(jìn)制)自動(dòng)安裝腳本
這篇文章主要為大家詳細(xì)介紹了Linux環(huán)境下mysql5.6.24二進(jìn)制自動(dòng)安裝腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
MySQL8 臨時(shí)關(guān)閉緩存的方法實(shí)現(xiàn)
在某些場景下,如基準(zhǔn)測試、數(shù)據(jù)一致性檢查或高頻數(shù)據(jù)更新,可能需要臨時(shí)關(guān)閉緩存以獲得更準(zhǔn)確的性能數(shù)據(jù)或解決性能問題,本文就詳細(xì)的介紹一下MySQL8 臨時(shí)關(guān)閉緩存的方法實(shí)現(xiàn),感興趣的可以了解一下2024-10-10
mysql5.7.14 解壓版安裝配置方法圖文教程(win10)
這篇文章主要為大家詳細(xì)介紹了win10下mysql5.7.14 winx64安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Mysql?InnoDB聚簇索引二級索引聯(lián)合索引特點(diǎn)
這篇文章主要為大家介紹了Mysql?InnoDB聚簇索引二級索引聯(lián)合索引特點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
解決MySQL啟動(dòng)報(bào)錯(cuò):Warning:mysqld.service changed on 
文章提示MySQL啟動(dòng)時(shí)報(bào)錯(cuò),因服務(wù)配置文件已更改,需運(yùn)行`systemctl daemon-reload`重新加載配置,隨后重啟MySQL服務(wù)以解決此問題2025-09-09

