![](https://img2023.cnblogs.com/blog/3076680/202309/3076680-20230904164459431-1322523641.png) # 1. 儘管SQL標準指定了部分函數,但資料庫廠商並沒有遵循這些函數規範 # 2. 字元串 ## 2.1. c ...
1. 儘管SQL標準指定了部分函數,但資料庫廠商並沒有遵循這些函數規範
2. 字元串
2.1. char
2.1.1. 固定長度、不足部分用空格填充的字元串
2.1.2. MySQL允許的char類型的最大長度為255個字元
2.1.3. Oracle Database允許的最大長度為2,000個字元
2.1.4. SQL Server允許的最大長度為8,000個字元
2.2. varchar
2.2.1. 變長字元串
2.2.2. MySQL允許的varchar類型的最大長度為65,536個字元
2.2.3. Oracle Database(通過varchar2類型)允許的最大長度為4,000個字元
2.2.4. SQL Server允許的最大長度為8,000個字元
2.3. text
2.3.1. MySQL和SQL Server
2.4. clob
2.4.1. Oracle Database
2.5. 保存非常大的可變長字元串
2.5.1. 文檔
2.5.2. MySQL有多種text類型(tinytext、text、mediumtext和longtext),可用於最大4GB的文檔
2.5.3. SQL Server為最大2GB的文檔提供了單一的text類型
2.5.3.1. SQL Server 2005還包括varchar(max)數據類型,並建議使用其代替text類型,text類型將在未來的某個版本中被刪除
2.5.4. Oracle Database包括clob數據類型,可保存最大為128TB的巨大文檔
2.6. 可以配置MySQL和SQL Server以實現悄無聲息地截斷字元串,而不是拋出異常
2.7. 從MySQL 6.0版開始,預設行為是“strict”模式,意味著在發生問題時拋出異常,而在早先版本的伺服器中,字元串會被截斷,併發出警告,如果希望資料庫引擎採取這種方式,可以選擇ANSI模式
2.8. 避免字元串被截斷(或是在Oracle Database和MySQL的strict模式下拋出異常)的最好方法是將列長度的上限設置得足夠大,以容納可能存儲在其中的最長的字元串(伺服器只會分配足以存儲字元串的空間,所以為varchar列設置長度更大的上限並不會浪費存儲資源
2.9. 包含單引號
2.9.1. 需要在字元串中添加轉義字元,以便伺服器將字元串中的撇號視為普通字元
2.9.2. 直接在單引號前再添加一個單引號進行轉義
2.9.3. mysql
-> UPDATE string_tbl
-> SET text_fld = 'This string didn''t work, but it does now';
2.9.4. Oracle Database和MySQL用戶也可以選擇使用反斜杠字元來轉義單引號
2.9.5. sql
UPDATE string_tbl SET text_fld =
'This string didn\'t work, but it does now'
2.9.6. 如果要檢索字元串,以用於屏幕顯示或報表欄位,則無須對內嵌引號作任何特殊處理
2.9.7. 如果要將檢索出的字元串添加到其他程式要讀取的文件中,就需要將轉義字元加入字元串
2.9.7.1. 如果使用的是MySQL,可以通過內建函數quote()來實現,該函數會將整個字元串放入引號內並對其中任意的引號/撇號進行轉義
2.9.7.2. mysql
-> SELECT quote(text_fld)
-> FROM string_tbl;
2.9.7.3. 在檢索數據用於數據導出時,可以對所有非系統生成的字元列(比如customer_notes列)使用quote()函數
2.10. 包含特殊字元
2.10.1. SQL Server和MySQL伺服器包含內建函數char()
2.10.2. Oracle Database用戶可以使用chr()函數
2.10.3. 用於從ASCII字元集的255個字元中任意構建字元串
2.10.4. 需要熟悉字元集的佈局,從中定位特定的字元
2.10.5. 可以使用concat()函數來拼接若幹字元串,可以自行輸入這些字元串,也可以通過char()函數生成
2.10.5.1. Oracle Database用戶可以使用拼接運算符(||)代替concat()函數
2.10.5.2. SQL Server並未提供concat()函數,需要使用拼接運算符(+)代替
2.10.6. 可以使用ascii()函數,該函數接受字元串最左側的字元,並返回其編碼數值
2.10.7. 使用char()、ascii()和concat()函數(或者拼接運算符),應該能夠處理任何羅馬字元,即使所用的鍵盤不包括重音字元或其他特殊字元
2.10.8. 返回數值的字元串函數
2.10.8.1. length()
2.10.8.1.1. 該函數返回字元串所包含的字元數
2.10.8.1.2. SQL Server用戶需要使用len()函數
2.10.8.2. position()函數
2.10.8.2.1. 字元串中查找子串的位置
2.10.8.2.2. 在使用資料庫時,一定要記住,字元串的第一個字元的位置為1
2.10.8.2.3. 如果沒有找到指定的子串,position()函數返回0
2.10.8.2.4. SQL:2003標準的一部分
2.10.8.3. locate()函數
2.10.8.3.1. MySQL專有的
2.10.8.3.2. 從目標字元串的其他位置開始搜索
2.10.8.3.3. 可以接受可選的第3個參數,該參數用於指定搜索的起始位置
2.10.8.4. instr()函數
2.10.8.4.1. Oracle Database專有
2.10.8.4.2. Oracle Database未提供函數position()或locate()
2.10.8.4.3. 該函數在使用兩個參數時,能夠模擬position()函數
2.10.8.4.4. 使用三個參數時,能夠模擬locate()函數
2.10.8.4.5. 返回值0 表示沒有找到指定的子串,而不是表示該子串位於字元串的位置0
2.10.8.5. charindx()函數
2.10.8.5.1. SQL Server專有
2.10.8.5.2. SQL Server也沒有提供position()或locate()函數
2.10.8.5.3. 該函數和Oracle的instr()函數類似,也可以接受兩個或三個參數
2.10.8.6. strcmp()
2.10.8.6.1. MySQL專有
2.10.8.6.1.1. 不區分大小寫
2.10.8.6.2. 無法在Oracle Database和SQL Server中模擬
2.10.8.6.3. 一個接受字元串作為參數並返回數值的字元串比較函數
2.10.8.6.3.1. −1(第一個字元串的排序位於第二個字元串之前)
2.10.8.6.3.2. 0(兩個字元串相同)
2.10.8.6.3.3. 1(第一個字元串的排序位於第二個字元串之後)
2.10.8.6.4. MySQL還允許在select子句中使用運算符like和regexp來比較字元串
2.10.8.6.4.1. 比較的結果為1(true)或0(false)
2.10.9. 返回字元串的字元串函數
2.10.9.1. concat()函數
2.10.9.1.1. 通過數據片段構建字元串
2.10.9.1.2. Oracle中使用,可以使用拼接運算符(||)來代替
2.10.9.1.3. SQL Server的拼接運算符(+)代替||
2.10.9.2. 在字元串中間添加或替換部分字元
2.10.9.2.1. insert()函數
2.10.9.2.1.1. MySQL提供的函數接受4個參數:原始字元串、起始位置、要替換的字元數量和替換字元串
2.10.9.2.1.2. mysql> SELECT INSERT('goodbye world', 1, 7, 'hello') string;
2.10.9.2.2. replace()函數
2.10.9.2.2.1. Oracle Database
2.10.9.2.2.2. SELECT REPLACE('goodbye world', 'goodbye', 'hello') FROM dual;
2.10.9.2.3. SQL Server也有replace()函數,其功能與Oracle Database的相同
2.10.9.2.4. SQL Server還提供了與MySQL的insert()函數功能相似的stuff()函數
2.10.9.2.4.1. SELECT STUFF('hello world', 1, 5, 'goodbye cruel')
2.10.9.2.5. 從字元串中提取子串
2.10.9.2.5.1. 三種資料庫伺服器均提供了substring()函數
2.10.9.2.5.2. Oracle Database提供的是substr()函數
3. 算術函數
3.1. acos(X)
3.1.1. 計算x的反餘弦
3.2. asin(x)
3.2.1. 計算x的反正弦
3.3. atan(x)
3.3.1. 計草x的反正切
3.4. cos(x)
3.4.1. 計軍x的餘弦
3.5. cot(x)
3.5.1. 計算x的餘切
3.6. exp(x)
3.6.1. 計算e
3.7. ln(x)
3.7.1. 計算x的自然對數
3.8. sin(x)
3.8.1. 計軍x的正弦
3.9. sqrt(x)
3.9.1. 計軍x的平方根
3.10. tan(x)
3.10.1. 計算x的正切
3.11. mod()函數
3.11.1. 用於計算餘數
3.11.2. 常用於整數參數
3.11.3. MySQL中也可以使用實數
3.11.3.1. mysql> SELECT MOD(22.75, 5);
3.11.4. SQL Server未提供mod()函數,可以使用運算符%來代替
3.12. pow()函數
3.12.1. 返回第一個參數的第二個參數次冪
3.12.2. Oracle Database或SQL Server,則為power()函數
3.12.3. pow(2,8)是MySQL中用於計算2^8的方式
3.12.4. 電腦記憶體通常是以2x位元組為單位分配的,所以pow()函數可以非常方便地確定某段記憶體確切的位元組數
3.12.4.1. mysql
-> SELECT POW(2,10) kilobyte, POW(2,20) megabyte,
-> POW(2,30) gigabyte, POW(2,40) terabyte;