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

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

1.2 sqlserver
支持

1.3 postgresql
支持

1.4 sqlite
支持

1.5 mysql
默認不支持

如果我們開啟 NO_BACKSLASH_ESCAPES 就能和sql標準一致了,如:

二、對象名稱引用符
2.1 oracle
規(guī)則:
- 只能用雙引號包裹對象名并且對象名本身不能含有雙引號
- 雙引號內(nèi)反斜杠不是轉義字符
- 雙引號內(nèi)不接受換行(但接受制表符)
實例:
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
規(guī)則:
- 只能用雙引號包裹對象名,如果對象名本身有雙引號,那么用兩個代表一個
- 雙引號內(nèi)反斜杠不是轉義字符(普通的字符串都不是,更何況對象名)
- 雙引號內(nèi)接受換行符、制表符等
實例:
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
規(guī)則:接受雙引號和中括號包裹對象名
當使用雙引號包裹對象名時:規(guī)則和postgresql一致
當使用中括號包裹對象名時:
- 外層中括號內(nèi)除了右中括號都是普通字符(包括換行、制表、反斜杠等),直到遇到右中括號
- 如果對象名本身含有左中括號,則直接寫就行(被包含在了上一行的規(guī)則內(nèi))
- 如果對象名本身含有右中括號,那么要用兩個右中括號表示一個
實例:
-- 正常情況 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 -- 左側第一個 '[' 認為是邊界, 中間的 ']]' 被當做一個 ']' 是表名一部分,又緊接著出現(xiàn)的 ']' 認為是結束邊界, 所以報錯 create table [te]]]st](id int) -- error -- 左側第一個 '[' 認為是邊界, 中間的 ']]]]' 被當做 ']]' 是表名一部分,最后一個認為是邊界 create table [te]]]]st358](id int) -- te]]st358 -- 左側第一個 '[' 認為是邊界, 中間的 ']]]]' 被當做 ']]' 是表名一部分,又緊接著出現(xiàn)的 ']' 認為是結束邊界, 所以報錯 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
規(guī)則:默認僅接受反引號包裹對象名
- 用雙引號包裹對象名,如果對象名本身有雙引號,那么用兩個代表一個
- 雙引號內(nèi)反斜杠不是轉義字符
- 雙引號內(nèi)接受換行符、制表符等-
實例:
-- 正常情況 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 時,可以使用雙引號,規(guī)則和 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無論是用雙引號還是反引號包裹對象名,內(nèi)部反斜杠都不是轉義符,這和
NO_BACKSLASH_ESCAPES沒關系
2.5 sqlite
規(guī)則:可以接受雙引號、反引號、中括號三種形式包裹對象名,但推薦雙引號
- 當是雙引號的時候和 postgresql 保持一致
- 當是反引號的時候和mysql保持一致
- 當是中括號的時候,除了對象名本身不能有右中括號外,和sqlserver一致
sqlite這個比較特殊,看著像是兼容sqlserver,但實際解析有問題:
如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
因為,mysql中沒有像sqlserver那樣額外的schema概念
3.3 postgresql
最多兩段,如:"schema"."table"
postgresql中不能跨庫查詢,所以只能到schema,這個schema和sqlserver中的類似
3.4 sqlite
最多兩段,如:"dbname"."table",但更常見的是一段,很少有兩段的情況
因為sqlite是嵌入式的單文件,所以一般操作都在這個文件內(nèi)都是一段,
但可以通過 attach 將另外幾個文件附加進來,這樣訪問附件進來的數(shù)據(jù)就是兩段了
3.5 oracle
最多有三段,如:"schema"."table"@dblink, 且最后一個 dblink 不能用雙引號括起來
總結
到此這篇關于sqlserver、mysql、oracle、pgsql、sqlite五大關系數(shù)據(jù)庫的對象名稱和轉義字符的文章就介紹到這了,更多相關關系數(shù)據(jù)庫對象名稱和轉義字符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL8.0?Command?Line?Client輸入密碼后出現(xiàn)閃退現(xiàn)象的原因以及解決方法總結
我們在安裝MYSQL數(shù)據(jù)庫時,經(jīng)常會出現(xiàn)一些問題,下面這篇文章主要給大家介紹了關于MySQL8.0?Command?Line?Client輸入密碼后出現(xiàn)閃退現(xiàn)象的原因以及解決方法的相關資料,需要的朋友可以參考下2023-03-03
mysql安裝navicat之后,出現(xiàn)2059,Authentication plugin及本地鏈接虛擬機docker,
這篇文章主要介紹了mysql安裝navicat之后,出現(xiàn)2059,Authentication plugin及本地鏈接虛擬機docker,遠程鏈接服務器,需要的朋友可以參考下2020-06-06
MySQL創(chuàng)建帶特殊字符的數(shù)據(jù)庫名稱方法示例
這篇文章主要給大家介紹了MySQL創(chuàng)建帶特殊字符的數(shù)據(jù)庫名稱方法,文中給出了詳細的示例代碼,需要的朋友可以參考學習,下面來一起看看吧。2017-03-03
MySQL敏感數(shù)據(jù)加密的實現(xiàn)方案
這篇文章主要介紹了MySQL敏感數(shù)據(jù)加密的實現(xiàn)方案,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值 ,需要的朋友可以參考下2024-02-02

