ãå
æ¥ã®ãããã ãã¯è¦ãã¦ãããã!!MySQL ã®ï¼ã¤ã®èªåå¤æã
http://d.hatena.ne.jp/sakaik/20100225/mysqlautochange
ã«ã¯ããããã®åé¿ãããã ããã
ãæã«ãã¡ãã®æå³ã¨éã£ã¡ãããã¨ãããããã©ãã±ãã²ã«æ°ã使ã£ã¦ããã MySQL ããããã»ã©ã«çããã«ãæããã¦ãããã¨ãå¤ããMySQLãã¡ã³ã®ä¸äººã¨ãã¦å¬ããéãã§ããã
ããã¦ããã®ã¨ã³ããªã®æå¾ã«ã
ããªãããSQLã¢ã¼ãããæå®ããã¨ãããã®åä½ãå¤æ´ãããã¨ãã§ãããSQLã¢ã¼ãã«ã¤ãã¦ã¯æ°ãåããããã¤ãç´¹ä»ãã¦ã¿ããã
ãã¨æ¸ããã¨ãããéæ»ã§ãã ã©ãã¼ãã¼ã®æ¨æææ²»æ°ãè£è¶³ã¨ã³ããªã¼ãæ¸ãã¦ãã ãã£ãã
ãããâãã ã©ãã¼ãã¼ããã°
ããã[åæã«è£è¶³]ããã ãã¯è¦ãã¦ãããã!!MySQL ã®ï¼ã¤ã®èªåå¤æ
ãããhttp://blog.kimuradb.com/?eid=838516
ã対å¿ã®ç´ æ©ãã¨å
容ã®ç確ããããã¦ã³ã³ãã¯ãã«ãºãã£ã¨ã¾ã¨ããææ³ã«ã·ããããç§ã¯ãã®ããã«ã¯æ¸ããªããæ¨ææ°ã®ãã©ãã¼ã«æè¬ãããã
ãæ¨ææ°ã®ææ³ã¨ã¯ç°ãªãããããã§ã¯ç§ãªãã®è§£èª¬ã試ã¿ããã
ããã¦ãæ¬ã¨ã³ããªã®ä¸»é¡ã§ãããæ°é
ãMySQLã¡ããã« "ããã¯é å¼µããªãã¦ããã" ã¨ä¼ãã¦ãããæ¹æ³ãï¼æ訳ï¼ã ãããã«ã¯ããã£ãä¸ç¨®é¡ã®åªæãç¥ã£ã¦ããã°ããï¼ãï¼åãã§ã¯ãªããï¼ç¨®é¡ãã§ããç¹ãããããããã£ãããï¼ã
ããã®åªæã¨ã¯ãæ¨ææ°ãç´¹ä»ãã¦ããã¦ãããSQLã¢ã¼ããã ãSQLã¢ã¼ãã®åªæãå±ããã° MySQL ã®æ°é
ããèªå好ã¿ã«ãããã¨ãã§ããã
ãæ¨ææ°ã®ã¨ã³ããªã§ã¯ãMySQLã®åèµ·åãªãããã«ãã®å ´ã§è©¦ããæ¹æ³ã¨ãã¦ã
ãã¨ããè¨æ³ãç´¹ä»ããã¦ãããè²ã ã¨å¤ãå¤ãã¦å®é¨ãã¦ã¿ãéã«ã¯ä¾¿å©ã ã mysqld åèµ·åæã«ãã®è¨å®ã¯æ¶å¤±ãã¦ãã¾ããåèµ·åæã«ãè¨å®å¤ãä¿æã§ããããã«ããããã«ãããã§ã¯ my.cnf ãã¡ã¤ã«ã¸ã®è¨è¿°ãæ¨å¥¨ãããã
ãã§ã¯ã²ã¨ã¤ã²ã¨ã¤è¦ã¦ãããã
ï¼. [æ°å¤] ç¯å²å¤ã®æ°å¤ã¯é ãæ¼ããã¤ãããã
ããã㯠SQL_MODE ã« 'STRICT_ALL_TABLES' ãæå®ãããã¨ã§ãç¯å²å¤ã®æ°åãã¨ã©ã¼ã«ãããã¨ãã§ãããmy.cnfï¼å¤ãã®å ´å /etc/my.cnfï¼ã® [mysqld] ã»ã¯ã·ã§ã³ã«ä»¥ä¸ã®è¨è¿°ã追å ã㦠mysqld ãåèµ·åãããã
sql_mode='STRICT_ALL_TABLES'
ããã®ç¶æ ã§ãååMySQLãã¨ã£ãã®å¤æ(?)ã§å¤ãå°ãããã¦ãã¾ã£ã INSERT æããé¡ããã¦ã¿ãã
mysql> INSERT INTO numtest VALUES (2200000000); ERROR 1264 (22003): Out of range value for column 'a' at row 1
ãsql_mode ã®åªæã®ãã¡ãSTRICT_ALL_TABLES ã¨ããã®ã¯è¬ãã°ãåæã«ãããã¼ãªäºã¯ããªãã§ããã¨ããæå³ã§ãããMySQLã¯ãã®è¨ãã¤ãããã£ããã¨å®ããããã¯ããããªãã§ãç¯å²ãè¶
ãã¦ãã¾ãããã主人ãã¾...ãã¨ã¨ã©ã¼ã§æãã¦ãããã®ã§ããããªãã¨å¾é ãªåã§ããããã
ãã¡ãªã¿ã«ãç¾å¨ã®ã»ãã·ã§ã³ã§ä½¿ç¨ããã¦ãã sql_mode 㯠SHOW VARIABLES ã§ç¢ºèªãããã¨ãã§ãã*1ãï¼ããã㯠@@sql_mode å¤æ°ã®å¤ã¨ãã¦åç §ãããã¨ãã§ããï¼
mysql> SHOW VARIABLES LIKE "%sql_mode%"; +---------------+-------------------+ | Variable_name | Value | +---------------+-------------------+ | sql_mode | STRICT_ALL_TABLES | +---------------+-------------------+
mysql> select @@sql_mode; +-------------------+ | @@sql_mode | +-------------------+ | STRICT_ALL_TABLES | +-------------------+
ï¼ï¼[æ°å¤] å°æ°ã¯åæã«ä¸¸ããããï¼warningãåºãªãï¼
ãæ´æ°åã®ã«ã©ã ã«å°æ°ãå ¥ãããã¨ããã¨èªåå¤æãã¦æ´æ°å¤ã¨ãã¦ç»é²ãããã¨ããã®ã¯ãMySQLã«éããå¤ãã®DBMSã§å ±éã®åä½ã®ããã ãæ®å¿µãªããç¾å¨ã®MySQLã§ã¯ãã®åä½ã¯å¤æ´ã§ããªãã(10/3)ã®ãããªå¤ã 3.333..... ã¨ãããã¨ã§ "3" ã¨ãã¦ç»é²ãããã
ããã ãã(10/0) ã®ããã«ã¼ãã§å²ã£ãå ´åã®åä½ã¯å¤æ´å¯è½ã ãMySQLæ¨æºã®ç¶æ ã§ã¯ã¼ãã§ã®é¤ç®ã¯ã¨ã©ã¼ã«ãªãã NULL ã¨ãªãï¼warningãåºãªãï¼ããããã¨ã©ã¼ã«ããã«ã¯ SQL_MODE ã« ERROR_FOR_DIVISION_BY_ZERO ãæå®ãããè¤æ°ã®SQLã¢ã¼ããæå®ããå ´åã¯ã³ã³ãåºåãã ãmy.cnfã«æ¸ãå ´åã¯ä»¥ä¸ã®ããã«ãªãã
sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO'
ãããã§ãã¼ãã§ã®å²ãç®ãã¨ã©ã¼ã«ãªã£ã¦ãããã
mysql> INSERT INTO numtest VALUES (10/0); ERROR 1365 (22012): Division by 0
ï¼ï¼[æ°å¤] æ°å以å¤ãå ¥ã£ã¦ããã¨åããã¨ããã¾ã§ãç»é²ãã¦ããã
ãããã¯ãï¼ãã§æå®ãã STRICT_ALL_TABLES ã¨ããSQLã¢ã¼ãã«ããããã§ã«ãã¡ããã¨ããã£ã¦ãããããã«ãªã£ã¦ããã
mysql> INSERT INTO numtest VALUES ("12B345"); ERROR 1265 (01000): Data truncated for column 'a' at row 1
ããã¯ããç¡çãªãã®ã¯ç¡çã¨è¨ã£ã¦ãããã»ãããäºãè¯ãé¢ä¿ãç¯ãããã§ããã
ï¼ï¼[æåå] é·ããè¶ ããã¨åæã«ã«ããããã
ãããã STRICT_ALL_TABLES SQLã¢ã¼ãã«ãããåæã«ã«ãããããªãããã«ãªã£ã¦ããã
mysql> INSERT INTO strtest VALUES ("ABCDEFGHIJKLMN"); ERROR 1406 (22001): Data too long for column 'a' at row 1
ï¼ï¼[æåå] ãæååé£çµãã®ã¤ããã§ãã£ãã + ã使ããª!!
ãæ¨ææ°ãè¿°ã¹ã¦ããéã ããããã+ãã¯æååãé£çµãããã®ã§ã¯ãªããSQLæ¨æºã§ã¯æååé£çµã¯ || ã ãMySQLã§ã¯æ¨æºã§ã¯ || 㯠OR ã®æå³ã§ä½¿ç¨ããããããæååé£çµã«ã¯ CONCAT() é¢æ°ã使ç¨ããã®ãå¯ä¸ã®æ¹æ³ã ã£ããããããSQLã¢ã¼ãã«ãã£ã¦åä½ãä»ã®DBMSã¨åãã«ãªãããã«å¤æ´ãããã¨ãã§ãããPIPES_AS_CONCAT ã ã
sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT'
mysql> INSERT INTO strtest VALUES ("ABC"||"123"); Query OK, 1 row affected (0.04 sec)
ï¼ï¼[æ¥ä»] å¹´ãï¼ã±ã¿ã§æå®ããéã®å¤æã«ã¼ã«
ã表é¡ã®ãå¹´ãï¼æ¡ã§æå®ããéãã«ã¤ãã¦ã¯ãåã¨ã³ããªã¼ã§ç´¹ä»ãããããªå¤æä»æ§ãå¤æ´ãããã¨ã¯ã§ããªããç¹°ãè¿ãã«ãªãããå¹´é¨åã¯ï¼æ¡ã§ä¸ããç¿æ
£ãã¤ãããã
ãæ¥ä»æå»åã«å¯¾ããåã« "2010" ã¨ããå¤ãå
¥ãããã¨ã㦠0000-00-00 ã¨ãã¦ç»é²ããã¦ãã¾ã£ã¦ããäºè±¡ã¯ãå®ã¯ SQL_MODE ã®STRICT_ALL_TABLESãæå®ãããã¨ã§ãã§ã«ã¨ã©ã¼ãåãããã«ãªã£ã¦ããã
mysql> INSERT INTO dttest VALUES ("2010"); ERROR 1292 (22007): Incorrect datetime value: '2010' for column 'a' at row 1
ãä¸æ¹ã§ãMySQLã®æ¥ä»å¤ã«é¢ããåºã許容åãããç¨åº¦å¶éãããã¨ã¯ãã§ãããååã®ã¨ã³ããªã§ã ã0000-00-00ãã¨ããæ¥ä»å¤ã許ããããã¨ã¯ç´¹ä»ããããé©ããã¨ã«å®ã¯MySQLã®æ¨æºã§ã¯å¹´ææ¥ã©ã®é¨åã§ãã¼ãã許ããã¦ããã
mysql> INSERT INTO dttest VALUES ("0000-00-00"); mysql> INSERT INTO dttest VALUES ("2010-00-00"); mysql> INSERT INTO dttest VALUES ("2010-02-00"); mysql> INSERT INTO dttest VALUES ("2010-00-30"); mysql> SELECT * FROM dttest; +---------------------+ | a | +---------------------+ | 0000-00-00 00:00:00 | | 0000-00-00 00:00:00 | | 2010-02-00 00:00:00 | | 2010-00-00 00:00:00 | | 2010-00-30 00:00:00 | +---------------------+
ããããã®æ¥ä»ã許ããªãããã®ã NO_ZERO_DATE(0000-00-00ãèªããªã),NO_ZERO_IN_DATE(å¹´ææ¥ã©ããï¼ç®æã§ãã¼ããããã®ã¯èªããªã)ã§ããã
ãããï¼ã¤ã®SQLã¢ã¼ãã追å ããç¶æ ã® my.cnf ä¸ã®SQL_MODEã®æå®ã¯ä»¥ä¸ã®ããã«ãªã£ã¦ããï¼
sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT, NO_ZERO_DATE,NO_ZERO_IN_DATE'
ããã®æå®ã«ãããã¼ããå«ãæ¥ä»ããã¡ãã¨ã¨ã©ã¼ã«ãã¦ãããããã«ãªã£ãã
mysql> INSERT INTO dttest VALUES ("2010-00-00"); ERROR 1292 (22007): Incorrect datetime value: '2010-00-00' for column 'a' at row 1
ä»åç´¹ä»ããSQLã¢ã¼ãã®ã¾ã¨ã
ãä»åã以ä¸ã®SQLã¢ã¼ããç´¹ä»ããã
STRICT_ALL_TABLES
ERROR_FOR_DIVISION_BY_ZERO
PIPES_AS_CONCAT
NO_ZERO_DATE
NO_ZERO_IN_DATE
ãå®ã¯ããããå«ãããã¤ãã®SQLã¢ã¼ããã¾ã¨ãã¦ãã²ã¨ã¤ã®SQLã¢ã¼ãã¨ãã¦ååãä»ãããã¦ãããã®ããã(ãã®æ©è½ã«ç¹ã«å®ã¾ã£ãååã¯ãªãããã ããç§ã¯ãSQLã¢ã¼ãã»ãããã¨å¼ã³ããï¼ã
ãSQLã¢ã¼ãã¨ã㦠(SQLã¢ã¼ãã»ããã®) 'TRADITIONAL' ãæå®ããã¨ã以ä¸ã®SQLã¢ã¼ããæå®ããããã¨ã«ãªãã*å°ã¯ä»åç´¹ä»ãããã®ã ã
ERROR_FOR_DIVISION_BY_ZERO (*) NO_AUTO_CREATE_USER NO_ZERO_DATE (*) NO_ZERO_IN_DATE (*) STRICT_ALL_TABLES (*) STRICT_TRANS_TABLES
ãSTRICT_TRANS_TABLE ã¯ãSTRICT_ALL_TABLES ã®åä½ããã©ã³ã¶ã¯ã·ã§ãã«ãªãã¼ãã«ã«ã®ã¿é©ç¨ãããã®ãªã®ã§ããã¨ã¯ NO_AUTO_CREATE_USER ãèªåã®ç°å¢ã§ã®éªéã«ãªããªããã¨ã確èªï¼ããã¥ã¢ã«ãåç
§ãã ããï¼ããä¸ã§ï¼
sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO, PIPES_AS_CONCAT,NO_ZERO_DATE,NO_ZERO_IN_DATE'
ãã¨ããé·ãSQLã¢ã¼ãã®æå®ã¯
sql_mode='TRADITIONAL,PIPES_AS_CONCAT'
ãã¨ããé常ã«çãã¢ã¼ãæå®ã§è¡¨ãããã¨ã«ãªããSQLã¢ã¼ãã»ããã便å©ã§ããã
ãSQLã¢ã¼ãã»ããã§ä½¿ç¨ãããã®ã¯ãå é¨ã§ã¯ããããã®SQLã¢ã¼ãã«å±éããã¦ãããã¨ã以ä¸ã®çµæãããããã
mysql> SELECT @@SQL_MODE;
PIPES_AS_CONCAT,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
ããã®ããã«èªå好ã¿ã«æ¹é ã§ãã¡ããMySQLãã©ãã ãããçã
ããªãã®ãæ°ã«å
¥ãã«ãªã£ãã®ã§ã¯ãªãã ãããã
ãSQLã¢ã¼ãã¯ããã§ç´¹ä»ãã以å¤ã§ãé¢ç½ããã®ããããããããæ¹ãã¦ç´¹ä»ã§ããã°ã¨æã£ã¦ããã
ãMySQLã¯ä¸çä¸ã®éè¦ãªã·ã¹ãã ã®è£å´ã§ã²ã£ããã¨æ¥ã ãæ°ãã¤ãããªããããããå ç¢ã«ãããã¤ãªãã¼ã¿ãå®ã£ã¦ããã¦ãããSQLã¢ã¼ãã使ã£ã¦ã³ãã¥ãã±ã¼ã·ã§ã³ããMySQLã¨ã®çµãä¸å±¤æ·±ããä¸å©ã«æ¬ã¨ã³ããªã¼ããªãã°å¹¸ãã§ããã
âMySQLé¢é£ã¨ã³ããªã¼
ã»これだけは覚えておきたい!!MySQL の6つの自動変換(本エントリの元ネタ)
ã»勝手に補足:これだけは覚えておきたい!!MySQL の6つの自動変換(木村デービー木村氏の補足エントリー)
ã»MySQL 5.5 の Semi-sync. を Windows 上で試してみた
ã»MySQL に関するつぶやきを一挙に見られる『MySweet』を公開しました
ã»早速MySQLメインサイトからダウンロードページへのリンクがなくなった
ã»知らなかった。mysql の -o オプション
ã»6月31日はいったい何日なのか。
.
*1:ã»ãã·ã§ã³ã§ã¯ãªãã°ãã¼ãã«ãªå¤ãè¦ãã«ã¯ SHOW GLOBAL VARIABLES æã使ã