mysql 補遺1

來源:互聯網
上載者:User

   最近小結歸納了些MYSQL中容易忽視和的操作,有的還是很不錯的.
1) perror代碼查看工具
     最近發現經常在MYSQL匯入匯出的時候,經常發現mysql中有error no:之類的錯誤提示資訊,但要具體知道錯在哪裡的話,
其實MYSQL有個內建的工具perror的,比如可以這樣用
   perror 30
就可以看到代碼30的是什麼錯誤資訊了.

2)mysqlcheck工具
   參數有 -c(檢查) ,-r(修複) -a(分析)  -O(最佳化)
如mysqlcheck -u root -p 表名 -c

3)myisampack 工具
   注意,這個工具可以壓縮表,但壓縮後的表只能唯讀了,可以減少空間.
   myisampack 表名
4 mysql狀態下,可以用optimize table 表名;來對錶進行最佳化,特別是可以將表中的片段空間進行合拼,只對myisam,innodb起作用.

5 查看MYSQL的各參數
   可以用show variables來查看,各參數的配置,還有查看伺服器的狀態,可以用show status;來查看,
但其實建議用phpmyadmin中的系統變數等快的方便的頁面方法查看,更加好.

6 sqlmode的介紹
   在my.ini中,可以看到有如下的設定
   # Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
預設是啟用的,
  在mysql 5中,預設的是REAL_AS_FLOAT,PIPES_AS_CONTACT,ANSI_QUOTES,GNORE_SPACE和ANSI,
在這種模式下,允許插入超過欄位長度的值,只是插入後,返回的是警告而不是錯誤,當用STRICT_TRANS_TABLES時,
則是錯誤了,嚴格的警告.

   NO_AUTO_CREATE_USER<!---->

防止GRANT自動建立新使用者,除非還指定了密碼。

  下面是手冊中的一些介紹
  

下面描述了支援的所有模式:

<!---->

·         ALLOW_INVALID_DATES

<!---->

在strict 模式下不要檢查全部日期。只檢查1到12之間的月份和1到31之間的日。這在Web應用程式中,當你從三個不同的欄位擷取年、月、日,並且想要確切儲存使用者插入的內容(不進行日期驗證)時很重要。該模式適用於DATE和DATETIME列。不適合TIMESTAMP列,TIMESTAMP列需要驗證日期。

<!---->

啟用strict 模式後,伺服器需要合法的月和日,不僅僅是分別在1到12和1到31範圍內。例如,禁用strict 模式時’2004-04-31′是合法的,但啟用strict 模式後是非法的。要想在strict 模式允許遮掩固定日期,還應啟用ALLOW_INVALID_DATES。

<!---->

·         ANSI_QUOTES

<!---->

將‘”’視為識別符引號(‘`’引號字元),不要視為字串的引號字元。在ANSI模式,你可以仍然使用‘`’來引用識別符。啟用ANSI_QUOTES後,你不能用雙引號來引用字串,因為它被解釋為識別符。

<!---->

·         ERROR_FOR_DIVISION_BY_ZERO

<!---->

在strict 模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL產生被零除警告,但操作結果為NULL。

<!---->

·         HIGH_NOT_PRECEDENCE

<!---->

NOT操作符的優先順序是運算式例如NOT a BETWEEN b AND c被解釋為NOT (a BETWEEN b AND c)。在一些舊版本MySQL中, 運算式被解釋為(NOT a) BETWEEN b AND c。啟用HIGH_NOT_PRECEDENCESQL模式,可以獲得以前的更高優先順序的結果。

<!---->

mysql> SET sql_mode = ‘’;
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
        -> 0
mysql> SET sql_mode = ‘broken_not’;
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
        -> 1

·         IGNORE_SPACE

<!---->

允許函數名和‘(’之間有空格。強制將所有函數名視為儲存的字。結果是,如果你想要訪問儲存為字的資料庫、表或列名,你必須引用它。例如,因為有USER()函數,mysql資料庫中的user表名和該表內的User列被儲存下來,因此你必須引用它們:

<!---->

SELECT "User" FROM mysql."user";

·         NO_AUTO_CREATE_USER

<!---->

防止GRANT自動建立新使用者,除非還指定了密碼。

<!---->

·         NO_AUTO_VALUE_ON_ZERO

<!---->

NO_AUTO_VALUE_ON_ZERO影響AUTO_INCREMENT列的處理。一般情況,你可以向該列插入NULL或0產生下一個序號。NO_AUTO_VALUE_ON_ZERO禁用0,因此只有NULL可以產生下一個序號。

<!---->

如果將0儲存到表的AUTO_INCREMENT列,該模式會很有用。(不推薦採用該慣例)。例如,如果你用mysqldump轉儲表並重載,MySQL遇到0值一般會產生新的序號,產生的表的內容與轉儲的表不同。重載轉儲檔案前啟用NO_AUTO_VALUE_ON_ZERO可以解決該問題。 mysqldump在輸出中自動包括啟用NO_AUTO_VALUE_ON_ZERO的語句。

<!---->

·         NO_BACKSLASH_ESCAPES

<!---->

禁用反斜線字元(‘\’)做為字串內的退出字元。啟用該模式,反斜線則成為一般字元。

<!---->

·         NO_DIR_IN_CREATE

<!---->

建立表時,忽視所有INDEX DIRECTORY和DATA DIRECTORY指令。該選項對從複製伺服器有用。

<!---->

·         NO_ENGINE_SUBSTITUTION

<!---->

如果需要的儲存引擎被禁用或未編譯,可以防止自動替換儲存引擎。

<!---->

·         NO_FIELD_OPTIONS

<!---->

不要在SHOW CREATE TABLE的輸出中列印MySQL專用列選項。該模式在可移植模式(portability mode)下用於mysqldump

<!---->

·         NO_KEY_OPTIONS

<!---->

不要在SHOW CREATE TABLE的輸出中列印MySQL專用索引選項。該模式在可移植模式(portability mode)下用於mysqldump

<!---->

·         NO_TABLE_OPTIONS

<!---->

不要在SHOW CREATE TABLE的輸出中列印MySQL專用表選項(例如ENGINE)。該模式在可移植模式(portability mode)下用於mysqldump

<!---->

·         NO_UNSIGNED_SUBTRACTION

<!---->

在減運算中,如果某個運算元沒有符號,不要將結果標記為UNSIGNED。請注意這樣使UNSIGNED BIGINT不能100%用於上下文中。參見12.8節,“Cast函數和操作符”。

<!---->

<!---->

·         NO_ZERO_DATE

<!---->

在strict 模式,不要將 ‘0000-00-00′做為合法日期。你仍然可以用IGNORE選項插入零日期。在非strict 模式,可以接受該日期,但會產生警告。

<!---->

·         NO_ZERO_IN_DATE

<!---->

在strict 模式,不接受月或日部分為0的日期。如果使用IGNORE選項,我們為類似的日期插入’0000-00-00′。在非strict 模式,可以接受該日期,但會產生警告。

<!---->

·         ONLY_FULL_GROUP_BY

<!---->

不要讓GROUP BY部分中的查詢指向未選擇的列。

<!---->

·         PIPES_AS_CONCAT

<!---->

將||視為字串串連操作符(+)(同CONCAT()),而不視為OR。

<!---->

·         REAL_AS_FLOAT

<!---->

將REAL視為FLOAT的同義字,而不是DOUBLE的同義字。

<!---->

·         STRICT_TRANS_TABLES

<!---->

為所有儲存引擎啟用strict 模式。非法資料值被拒絕。後面有詳細說明。

<!---->

·         STRICT_TRANS_TABLES

<!---->

為事務儲存引擎啟用strict 模式,也可能為非事務儲存引擎啟用strict 模式。後面有詳細說明。

<!---->

strict 模式控制MySQL如何處理非法或丟失的輸入值。有幾種原因可以使一個值為非法。例如,資料類型錯誤,不適合列,或超出範圍。當新插入的行不包含某列的沒有顯示定義DEFAULT子句的值,則該值被丟失。

<!---->

對於事務表,當啟用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式時,如果語句中有非法或丟失值,則會出現錯誤。語句被放棄並滾動。

<!---->

對於非事務表,如果插入或更新的第1行出現壞值,兩種模式的行為相同。語句被放棄,表保持不變。如果語句插入或修改多行,並且壞值出現在第2或後面的行,結果取決於啟用了哪個嚴格選項:

<!---->

·         對於STRICT_ALL_TABLES,MySQL返回錯誤並忽視剩餘的行。但是,在這種情況下,前面的行已經被插入或更新。這說明你可以部分更新,這可能不是你想要的。要避免這點,最好使用單行語句,因為這樣可以不更改表即可以放棄。

<!---->

·         對於STRICT_TRANS_TABLES,MySQL將非法值轉換為最接近該列的合法值並插入調整後的值。如果值丟失,MySQL在列中插入隱式預設值。在任何情況下,MySQL都會產生警告而不是給出錯誤並繼續執行語句。13.1.5節,“CREATE TABLE文法”描述了隱式預設值。

<!---->

strict 模式不允許非法日期,例如’2004-04-31′。它不允許禁止日期使用“零”部分,例如’2004-04-00′或“零”日期。要想禁止,應在strict 模式基礎上,啟用NO_ZERO_IN_DATE和NO_ZERO_DATE SQL模式。

<!---->

如果你不使用strict 模式(即不啟用STRICT_TRANS_TABLES或STRICT_ALL_TABLES模式),對於非法或丟失的值,MySQL將插入調整後的值並給出警告。在strict 模式,你可以通過INSERT IGNORE或UPDATE IGNORE來實現。參見13.5.4.22節,“SHOW WARNINGS文法”。

<!---->

下面的特殊模式快速組合了前面所列的模式。

<!---->

其中包括大多數最新版本MySQL中的所有模式值。舊版本中,組合模式不包括新版本中沒有的不適用的具體模式值。

<!---->

·         ANSI

<!---->

等同REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE。參見1.8.3節,“在ANSI模式下運行MySQL”。

<!---->

·         DB2

<!---->

等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS。

<!---->

·         MAXDB

<!---->

等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER。

<!---->

·         MSSQL

<!---->

等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS。

<!---->

·         MYSQL323

<!---->

等同NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE。

<!---->

·         MYSQL40

<!---->

等同NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE。

<!---->

·         ORACLE

<!---->

等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER。

<!---->

·         POSTGRESQL

<!---->

等同PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS。

<!---->

·         TRADITIONAL

<!---->

等同STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.