1. 程式人生 > >Access denied for user 'root'@'min'(using password:YES)

Access denied for user 'root'@'min'(using password:YES)

問題:

人生處處充滿了坑。。
昨天出現時間戳超出範圍在網上尋找答案時對mysql資料庫操作了sql_mode
這裡寫圖片描述
在後面不行最後還是自己找到了解決方法、就下班了、今天一上班、發現mysql總是報1045 - Access denied for user ‘root’@’min’(using password:YES);查資料發現是改變mysql模式(sql_mode)

sql_mode 常用值說明

1. SQL語法支援類

  • ONLY_FULL_GROUP_BY 對於GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的。是可以理解的,因為不在 group by 的列查出來展示會有矛盾。
    在5.7中預設啟用,所以在實施5.6升級到5.7的過程需要注意:
 Expression #1 of SELECT list is not in GROUP BY
clause and contains nonaggregated column
'1066export.ebay_order_items.TransactionID' which
is not functionally dependent on columns in GROUP BY
clause; this is incompatible with sql_mode=only_full_group_by
  • ANSI_QUOTES 啟用 ANSI_QUOTES 後,不能用雙引號來引用字串,因為它被解釋為識別符,作用與 ` 一樣。設定它以後,update t set f1=”” …,會報 Unknown column ” in ‘field list 這樣的語法錯誤。
  • PIPES_AS_CONCAT 將 || 視為字串的連線操作符而非 或 運算子,這和Oracle資料庫是一樣的,也和字串的拼接函式 CONCAT() 相類似。
  • NO_TABLE_OPTIONS 使用 SHOW CREATE TABLE 時不會輸出MySQL特有的語法部分,如 ENGINE ,這個在使用 mysqldump 跨DB種類遷移的時候需要考慮。
  • NO_AUTO_CREATE_USER 字面意思不自動建立使用者。在給MySQL使用者授權時,我們習慣使用 GRANT … ON … TO dbuser 順道一起建立使用者。設定該選項後就與oracle操作類似,授權之前必須先建立使用者。5.7.7開始也默認了。

    1. 資料檢查類
  • NO_ZERO_DATE 認為日期 ‘0000-00-00’ 非法,與是否設定後面的嚴格模式有關。
    如果設定了嚴格模式,則 NO_ZERO_DATE 自然滿足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然允許且只顯示warning
    如果在非嚴格模式下,設定了NO_ZERO_DATE,效果與上面一樣,’0000-00-00’允許但顯示warning;如果沒有設定NO_ZERO_DATE,no warning,當做完全合法的值。

  • NO_ZERO_IN_DATE情況與上面類似,不同的是控制日期和天,是否可為 0 ,即 2010-01-00 是否合法。
  • NO_ENGINE_SUBSTITUTION 使用 ALTER TABLE或CREATE TABLE 指定 ENGINE 時, 需要的儲存引擎被禁用或未編譯,該如何處理。啟用NO_ENGINE_SUBSTITUTION時,那麼直接丟擲錯誤;不設定此值時,CREATE用預設的儲存引擎替代,ATLER不進行更改,並丟擲一個 warning .
  • STRICT_TRANS_TABLES 設定它,表示啟用嚴格模式。
    注意 STRICT_TRANS_TABLES 不是幾種策略的組合,單獨指 INSERT、UPDATE出現少值或無效值該如何處理:
    前面提到的把 ” 傳給int,嚴格模式下非法,若啟用非嚴格模式則變成0,產生一個warning
    Out Of Range,變成插入最大邊界值
    A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition
    上面並沒有囊括所有的 SQL Mode,選了幾個代表性的,詳細還是 看手冊。

sql_mode一般來說很少去關注它,沒有遇到實際問題之前不會去啟停上面的條目。我們常設定的 sql_mode 是 ANSI、STRICT_TRANS_TABLES、TRADITIONAL,ansi和traditional是上面的幾種組合。

  • ANSI:更改語法和行為,使其更符合標準SQL
    相當於REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE
  • TRADITIONAL:更像傳統SQL資料庫系統,該模式的簡單描述是當在列中插入不正確的值時“給出錯誤而不是警告”。
    相當於 STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
  • ORACLE:相當於 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER
    無論何種mode,產生error之後就意味著單條sql執行失敗,對於支援事務的表,則導致當前事務回滾;但如果沒有放在事務中執行,或者不支援事務的儲存引擎表,則可能導致資料不一致。MySQL認為,相比直接報錯終止,資料不一致問題更嚴重。於是 STRICT_TRANS_TABLES 對非事務表依然儘可能的讓寫入繼續,比如給個”最合理”的預設值或截斷。而對於 STRICT_ALL_TABLES,如果是單條更新,則不影響,但如果更新的是多條,第一條成功,後面失敗則會出現部分更新。

5.6.6 以後版本預設就是NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,5.5預設為 ” 。

3. 設定 sql_mode

檢視

檢視當前連線會話的sql模式:

mysql> select @@session.sql_mode;
或者從環境變數裡取
mysql> show variables like "sql_mode";


檢視全域性sql_mode設定:
mysql> select @@global.sql_mode;

只設置global,需要重新連線進來才會生效

設定

形式如
mysql> set sql_mode='';
mysql> set global sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';


如果是自定義的模式組合,可以像下面這樣

Adding only one mode to sql_mode without removing existing ones:
mysql> SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));

Removing only a specific mode from sql_mode without removing others:
mysql> SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));

配置檔案裡面設定 sql-mode=”“。