MySQL規範與疑難雜症

2022-03-14 06:03:36 字數 1885 閱讀 9457

1.sql_mode

sql_mode可能是比較容易讓開發人員和dba忽略的乙個變數,預設為空。sql_mode的設定其實是比較冒險的一種設定,因為在這種設定下可以允許一些非法操作,比如可以將null插入not null的字段中,也可以插入一些非法日期,如「2012-12-32」。因此在生產環境中強烈建議開發人員將這個值設為嚴格模式,這樣有些問題可以在資料庫的設計和開發階段就能發現,而如果在生產環境下執行資料庫後發現這類問題,那麼修改的代價將變得十分巨大。此外,正確地設定sql_mode還可以做一些約束(constraint)檢查的工作。

對於sql_mode的設定,可以在mysql的配置檔案如my.cnf和my.ini中進行,也可以在客戶端工具中進行,並且可以分別進行全域性的設定或當前會話的設定。

查詢命令:下面的命令可以用來檢視當前sql_mode的設定情況:

mysql>

select

@@global.sql_mode;

結果如下:

+---------------------+

| @@global.sql_mode   |

+---------------------+

| strict_trans_tables |

+---------------------+

1 row in set (0.07 sec)

設定sql_mode命令:

set session sql_mode=

'strict_trans_tables

';

各種模式:

嚴格模式是指將sql_mode變數設定為strict_trans_tables或strict_all_tables中的至少一種。現在來看一下sql_mode可以設定的選項。

strict_trans_tables:在該模式下,如果乙個值不能插入到乙個事務表(例如表的儲存引擎為innodb)中,則中斷當前的操作不影響非事務表(例如表的儲存引擎為myisam)。

allow_invalid_dates:該選項並不完全對日期的合法性進行檢查,只檢查月份是否在1~12之間,日期是否在1~31之間。該模式僅對date和datetime型別有效,而對timestamp無效,因為timestamp總是要求乙個合法的輸入。

ansi_quotes:啟用ansi_quotes後,不能用雙引號來引用字串,因為它將被解釋為識別符,示例如下:

mysql>

create

table z ( a varchar(10))engine=

innodb;

query ok,

0 rows affected (0.00

sec)

mysql

>

insert

into z select

"aaa";

query ok,

1 rows affected (0.00

sec)

mysql

>

set sql_mode=

'ansi_quotes';

query ok,

0 rows affected (0.00

sec)

mysql

>

insert

into z select

"aaa";

error

1054 (42s22): unknown column

'aaa'in

'field list

'

注意:每次斷開後,就要重新執行上面的sql,才能使sql_mode模式生效。

Hadoop疑難雜症

前天安裝了pig,本來寫了條pig latin,但一直卡在 17 05 07 17 47 07 info mapreduce.job running job job 1494150363568 0001跑不通,想著肯定是mapredcue自身有問題,於是開始了艱苦的檢錯之旅,從csdn到stackf...

Appium疑難雜症

坑之初體驗 1.session大於60秒沒接收到命令自動關閉 python desired caps 在啟動配置裡面加入newcommandtimeout引數 desired caps newcommandtimeout 200 但是注意cnpm預設在當前目錄安裝npm包。3.uiautomatio...

疑難雜症 列舉

1.列舉是使用者自定義的整數型別 2.關於列舉的一般用法,參照 c 中的列舉 3.從字串中獲取列舉值 定義如下的列舉 public enum timeofday 從乙個字串得到列舉值,並轉換為整數 timeofday time timeofday enum.parse typeof timeofda...