萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> sql server教程 >> MySQL中文參考手冊6(MySQL與標准的兼容性)對ANSISQL92擴充

MySQL中文參考手冊6(MySQL與標准的兼容性)對ANSISQL92擴充

MySQL中文參考手冊6(MySQL與標准的兼容性)wwww.iTbulo.comNLBAZ

轉載 譯者:晏子

〖返回〗〖轉發〗

q譯者:晏子 ([email protected])主頁:http://linuxdb.yeah.net

5 MySQL與標准的兼容性?
5.1   MySQL對ANSI SQL92擴充
MySQL包含了一些可能在其他SQL數據庫找不到的擴充。要注意如果你使用他們,你的代碼將不與其他SQL服務器兼容。在一些情況下,你可以編寫包括MySQL擴展的代碼,但是仍然是可移植的,通過使用/*! ... */形式的注釋。在這種情況下,MySQL將進行詞法分析並且執行在注釋內的代碼,好像它是任何其它MySQL語句,但是其他SQL服務器將忽略擴展。例如: 
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ... 
如果你在'!'後增加一個版本數字,該語法將僅在MySQL版本是等於或比使用的版本數字新時才執行: 

CREATE /*!32302 TEMPORARY */ TABLE (a int);

上面的意思是如果你有3.23.02或更新,那麼MySQL將使用TEMPORARY關鍵詞。 

MySQL擴展被列在下面:


      
  • 字段類型MEDIUMINT、SET、ENUM和不同的BLOB和TEXT類型。 
      
      
  • 字段屬性AUTO_INCREMENT、BINARY、UNSIGNED和ZEROFILL。 
      
      
  • 缺省地,所有的字符串比較是忽略大小寫的,由當前的字符集決定了(缺省為ISO-8859-1Latin1)排序順序。如果你不喜歡這樣,你應該用BINARY屬性或使用BINARY強制符聲明列,它導致根據MySQL服務器主機的ASCII順序進行排序。 
      
      
  • MySQL將每個數據庫映射一個MySQL數據目錄下面的目錄,將數據庫表映射到數據庫目錄下的數據庫文件名。這有2個含意: 
        

            
    • 在區分大小寫文件名的操作系統(象大多數 Unix 系統一樣)上的MySQL中數據庫名字和表名是區分大小寫的。如果你有困難記得表名,接受一個一致的約定,例如總是用小寫名字創建數據庫和表。  
    • 數據庫、表、索引、列或別名可以以數字開始(但是不能僅由數字組成)。
            
    • 你可以使用標准的系統命令備份、重命名、移動、刪除和拷貝表。例如,重命名一個表,重命名“.MYD”、“.MYI”和“.frm”文件為相應的表      

      
      
  • 在SQL語句中,你可以用db_name.tbl_name語法訪問不同數據庫中的表。一些SQL服務器提供同樣的功能但是稱它們為這User space(用戶空間)。MySQL不支持類似在create table ralph.my_table...IN my_tablespace中的表空間。 
      
  • LIKE在數字列上被允許。 
      
  • 在一SELECT語句裡面使用INTO OUTFILE和STRAIGHT_JOIN。見7.12 SELECT句法. 
      
  • 在一個SELECT語句中SQL_SMALL_RESULT選項。 
      
  • EXPLAIN SELECT得到如何聯結表的描述。 
      
  • 在一個CREATE TABLE語句裡面使用索引、在字段前綴上的索引和使用INDEX或KEY。見7.7 CREATE TABLE 句法。 
      
  • CREATE TABLE使用TEMPORARY或IF NOT EXISTS。 
      
  • 使用COUNT(DISTINCT list),這裡“list”超過一個元素。 
      
  • 在一個ALTER TABLE語句裡面使用CHANGE col_name、DROP  col_name或DROP INDEX。見7.8 ALTER TABLE句法。 
      
  • 在一個ALTER TABLE裡面語句使用IGNORE。 
      
  • 在一個ALTER TABLE語句中使用多重ADD、ALTER、DROP或CHANGE子句。 
      
  • 使用帶關鍵詞IF EXISTS的DROP TABLE。
      
  • 你能用單個DROP TABLE語句拋棄多個表。 
      
  • DELETE語句的LIMIT子句。 
      
  • INSERT和REPLACE語句的DELAYED子句。 
      
  • INSERT, REPLACE, DELETE和UPDATE語句的LOW_PRIORITY子句。  
      
  • 使用LOAD DATA INFILE。在多數情況下,這句法與Oracle的LOAD DATA INFILE兼容。見7.16 LOAD DATA INFILE 句法。 
      
  • OPTIMIZE TABLE語句。見7.9 OPTIMIZE TABLE句法。 
      
  • SHOW語句。見7.21 SHOW句法(得到表、列等的信息)。 
      
  • 字符串可以被“"”或“'”包圍,而不只是“'”。 
      
  • 使用“”轉義字符。  
      
  • SET OPTION語句。見7.25 SET OPTION句法。 
      
  • 你不需要命名所有在GROUP BY部分的被選擇的列。這為一些很特定的情況給出更好的性能,而不是一般的查詢。見7.4.13 用於GROUP BY子句的函數。 
      
  • 為了方便來自於SQL環境其他為用戶,MySQL對許多函數支持別名。例如,所有的字符串功能都支持ANSI  SQL句法和 ODBC句法。 
      
  • MySQL理解||和&&意味著邏輯的OR和AND,就像在C程序語言中。在MySQL中,||和OR是同義詞&&和AND是同義詞。正因為這個好的句法,MySQL對字符串並置的不支持ANSI SQL ||操作符;相反使用CONCAT(),因為CONCAT()接受任何數量的參數,很容易把||操作符使用變換到MySQL
      
  • CREATE DATABASE或DROP DATABASE。見7.5 CREATE DATABASE句法。 
          
      
  • %操作符是MOD()一個同義詞,即,N % M等價於MOD(N,M)。%支持C程序員並與PostgreSQL兼容。 
      
      
  • =, <>, <=,<, >=,>, <<, >>, <=>, AND, OR或LIKE操作符可以放在SELECT語句的FROM左邊用於比較列。例如: 
    mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
      
      
  • LAST_INSERT_ID()函數。見20.4.29  mysql_insert_id()。 
      
  • 擴展的正則表達式操作符REGEXP和NOT REGEXP。 
      
  • CONCAT()或CHAR()有一個參數或超過2個參數。(在MySQL中,這些函數可取任何數量的參數。)
      
  • BIT_COUNT(), CASE, ELT(), FROM_DAYS(), 
        FORMAT(), IF(), PASSword(), ENCRYPT(), 
        md5(), ENCODE(), DECODE(), PERIOD_ADD(), 
        PERIOD_DIFF(), TO_DAYS(),或WEEKDAY()函數。 
      
  • 使用TRIM()整修子串。ANSI SQL 只支持單個字符的刪除。 
      
  • GROUP BY函數STD(), BIT_OR()和BIT_AND()。 
      
  • 使用REPLACE而不是DELETE+INSERT。見7.15 REPLACE句法。 
      
  • FLUSH flush_option語句。 
      
  • 在一個語句用:=設置變量的可能性: 
         SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table;
         SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
      


5.2 以ANSI模式運行MySQL
如果你用--ansi選項啟動mysqld,MySQL的下列行為改變。 

      
  • ||是字符串並置而不是OR。
      
  • 可在一個函數名字之間與“(”有任何數量的空格。這也使所有的功能名字成為保留詞。 
      
      
  • "將是一個標識符引號字符(象MySQL `引號字符一樣)而不是一個字符串引號字符。 
      
      
  • REAL將是FLOAT一個同義詞,不是DOUBLE一個同義詞。 
      


5.3 MySQL相比ANSI SQL92的差別
我們嘗試使得MySQL遵照ANSI SQL標准和ODBC SQL標准,但是在一些情況下,MySQL做一些不同的事情: 

      
  • --只是一個注釋,如果後面跟一個白空字符。見5.4.7 `--'作為一個注釋的開始。 
      
      
  • 對於VARCHAR列,當值被存儲時,拖後的空格被刪除。見E MySQL已知的錯誤和設計缺限。 
      
  • 在一
copyright © 萬盛學電腦網 all rights reserved