最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

sqlserver、mysql、oracle、pgsql、sqlite五大關系數(shù)據(jù)庫的對象名稱和轉義字符

 更新時間:2025年11月12日 11:41:36   作者:jackletter  
這篇文章主要介紹了sqlserver、mysql、oracle、pgsql、sqlite五大關系數(shù)據(jù)庫的對象名稱和轉義字符的相關資料,文中通過代碼介紹的非常詳細,對大家學習或者使用數(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 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子句是根據(jù)條件表達式的結果來執(zhí)行不同的邏輯操作,它使用在WHERE子句中,以根據(jù)特定的條件在查詢結果中過濾數(shù)據(jù),需要的朋友可以參考下
    2023-08-08
  • mac系統(tǒng)下mysql 8.0.11 安裝指南

    mac系統(tǒng)下mysql 8.0.11 安裝指南

    這篇文章主要為大家詳細介紹了mac系統(tǒng)下mysql 8.0.11 安裝指南,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • MySQL8.0?Command?Line?Client輸入密碼后出現(xiàn)閃退現(xiàn)象的原因以及解決方法總結

    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自動安裝批處理腳本實例代碼

    MySQL自動安裝批處理腳本實例代碼

    為了日后安裝數(shù)據(jù)庫方便,下面這篇文章主要給大家介紹了關于MySQL自動安裝批處理腳本的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • mysql安裝navicat之后,出現(xiàn)2059,Authentication plugin及本地鏈接虛擬機docker,遠程鏈接服務器

    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ù)庫名稱方法示例

    這篇文章主要給大家介紹了MySQL創(chuàng)建帶特殊字符的數(shù)據(jù)庫名稱方法,文中給出了詳細的示例代碼,需要的朋友可以參考學習,下面來一起看看吧。
    2017-03-03
  • MySQL進階SELECT語法篇

    MySQL進階SELECT語法篇

    從這個基本語法可以看出,最簡單的SELECT語句是SELECT select_list,實際上利用這個最簡單的SELECT語句,你也可以完成許多你期待的功能,首先你能利用它進行MySQL所支持的任何運算,例如:SELECT 1+1,它將返回2;其次,你也能利用它給變量賦值,而在PHP中,運用SELECT語句的這種功能,你就可以自由地運用MySQL的函數(shù)為PHP程序進行各種運算,并賦值給變量。在很多的時候,你會發(fā)現(xiàn)MySQL擁有許多比PHP更為功能強大的函數(shù)。
    2008-04-04
  • MySQL敏感數(shù)據(jù)加密的實現(xiàn)方案

    MySQL敏感數(shù)據(jù)加密的實現(xiàn)方案

    這篇文章主要介紹了MySQL敏感數(shù)據(jù)加密的實現(xiàn)方案,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2024-02-02
  • MySQL中查詢json格式的字段實例詳解

    MySQL中查詢json格式的字段實例詳解

    這篇文章主要給大家介紹了關于MySQL中查詢json格式字段的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03

最新評論

望谟县| 昌乐县| 临猗县| 青州市| 交城县| 登封市| 南召县| 清远市| 盈江县| 玉树县| 湟中县| 临夏县| 汉中市| 华阴市| 湖南省| 武夷山市| 绵竹市| 乌什县| 区。| 凤翔县| 宜宾县| 绥棱县| 阜新| 高尔夫| 醴陵市| 乳源| 遂宁市| 黄大仙区| 增城市| 海晏县| 正镶白旗| 金堂县| 五家渠市| 晋城| 同江市| 灌阳县| 宁乡县| 长兴县| 慈利县| 普定县| 小金县|