【MySQL】老版本mysql奇怪的報錯:ERROR 1046 (3D000): No database selected(BUG)

神諭丶發表於2016-03-18

開發給到一條sql,要對專案的各個庫做批量的update,寫在指令碼里之後,執行時發現失敗,報錯
ERROR 1046 (3D000): No database selected,發現有指定庫名,產生疑問。
確定已經指定庫名之後,然後改寫成select做了查詢,發現依然報這個錯。


再細看sql,發現unhex函式的寫法不嚴謹,即括號沒有緊跟,
也就是說,需要用unhex()替代unhex ()。

繼續做了個測試,發現報錯資訊相同,但是毫不相干:
既然是函式寫法不規矩,怎麼和是否選擇資料庫有關?

  1. mysql> SELECT NOW ();
  2. ERROR 1046 (3D000): No database selected

確定了一下DB版本:
  1. mysql> SELECT version();
  2. +-----------------------+
  3. | 5.0.51a-24+lenny2-log | 
  4. +-----------------------+
  5. 1 row in set (0.00 sec)

遠古版本,估計bug較多,換了一個mysql5.5的版本做測試:
發現報錯正常:
  1. mysql> SELECT NOW ();
  2. ERROR 1305 (42000): FUNCTION now does not exist

大概猜測是老版本(mysql5.0)BUG。5.1未做測試。

但無論是否是老版本還是新版本,函式名後不緊跟括號都會報錯,只不過5.0丟擲的錯誤比較奇葩,讓人看不懂。
當然,在sql_mode裡新增“IGNORE_SPACE”既可以忽略此類問題,但是不推薦:
  1. mysql> SELECT VERSION();
  2. +-----------------------+
  3. | VERSION()             |
  4. +-----------------------+
  5. | 5.0.51a-24+lenny2-log | 
  6. +-----------------------+
  7. 1 row in set (0.00 sec)


  8. mysql> SELECT NOW ();   
  9. ERROR 1046 (3D000): No database selected


  10. mysql> SHOW VARIABLES LIKE 'sql_mode';
  11. +---------------+-------+
  12. | Variable_name | Value |
  13. +---------------+-------+
  14. | sql_mode      |       | 
  15. +---------------+-------+
  16. 1 row in set (0.00 sec)


  17. mysql> SET @@session.sql_mode='IGNORE_SPACE';
  18. Query OK, 0 rows affected (0.00 sec)


  19. mysql> SELECT NOW ();     
  20. +---------------------+
  21. | NOW ()              |
  22. +---------------------+
  23. | 2016-03-18 02:00:14 | 
  24. +---------------------+
  25. 1 row in set (0.00 sec)

作者微信公眾號(持續更新)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2059201/,如需轉載,請註明出處,否則將追究法律責任。

相關文章