Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQLがゆるふわなのはどう考えてもSQLモードが悪い!

13fbd31a4503c352369aab017e3edef7?s=47 Leko
July 31, 2015

 MySQLがゆるふわなのはどう考えてもSQLモードが悪い!

13fbd31a4503c352369aab017e3edef7?s=128

Leko

July 31, 2015
Tweet

Transcript

  1. None
  2. ࡶίϥ͢Έ·ͤΜɻಋೖͰ͢ • DATEʹෆਖ਼ͳܗࣜΛೖΕΔͱ0000-00-00 • VARCHARͷ௕੍͞ݶΛ௒͑Δͱ੾ΓऔΒΕΔ • Φʔόʔϑϩʔ͢Δͱ஋ؙ͕ΊΒΕΔ • AIͳΧϥϜʹ0Λૠೖ͢Δͱࣗಈ࠾൪͞ΕΔ
 etc,

    etc…
  3. ࠓ೥౓ͷࢲͷҧ࿨ײ • ৽ଔݚम • VARCHARͰ௕੍͞ݶΛ௒͑ͨΒΤϥʔग़ͨʂʁ • ๭ΞϓϦʹͯ൚༻όϦσʔγϣϯͷ࣮૷ • Φʔόʔϑϩʔͨ͠Βͦ΋ͦ΋ΤϥʔͰྑ͘ͳ͍ʁ •

    ෆਖ਼ͳ೔෇ͬͯͦ΋ͦ΋DBଆͰ஄͚ͳ͍ͷ…ʁ • αʔόҠઃ • SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
 ͬͯͳΜ͚ͩͬɾɾɾʁ( ˘ω˘)
  4. αʔόʔSQLϞʔυ ެࣜϚχϡΞϧ / en

  5. αʔόʔSQLϞʔυ #ͱ͸ • αʔόʔSQLϞʔυ͸ɺMySQLͰαϙʔτ͞ ΕΔSQLߏจɺ͓Αͼ࣮ߦ͞ΕΔσʔλଥ౰ੑ νΣοΫͷछྨΛఆٛ͠·͢ɻ͜ΕʹΑΓɺ MySQLΛ͞·͟·ͳ؀ڥͰ࢖༻ͨ͠Γɺ MySQLΛ΄͔ͷσʔλϕʔεαʔόʔͱҰॹ ʹ࢖༻ͨ͠Γ͢Δ͜ͱ͕ɺ͞Βʹ༰қʹͳΓ ·͢ɻ

    A.3. MySQL 5.6 FAQ: αʔόʔ SQL Ϟʔυ
  6. DATEʹෆਖ਼஋ΛೖΕΔͱ0000-00-00 • ALLOW_INVALID_DATES • αʔόʔ͸ɺ݄ͱ೔ͷ஋͕ͦΕͧΕ1͔Β12·ͨ͸1 ͔Β31ͷൣғʹ͋Δ͜ͱ͚ͩͰͳ͘ɺਖ਼͍͠஋Ͱ͋ Δ͜ͱΛཁٻ͠·͢ɻݫີϞʔυ͕ແޮʹͳ͍ͬͯΔ ͱɺ'2004-04-31'ͷΑ͏ͳແޮͳ೔෇͸'0000-00-00' ʹม׵͞Εɺܯࠂϝοηʔδ͕දࣔ͞Ε·͢ɻݫີ Ϟʔυ͕༗ޮͳͱ͖͸ɺແޮͳ೔෇ʹΑͬͯΤϥʔ͕

    ൃੜ͠·͢ɻ
  7. VARCHARͷ௕੍͞ݶΛ௒͑Δͱ etc • τϥϯβΫγϣϯςʔϒϧ(ex. InnoDB)ͷ৔ ߹ɺ STRICT_ALL_TABLES ·ͨ͸ STRICT_TRANS_TABLES ͷ͍ͣΕ͔͕༗ޮͳ

    ͱ͖ɺσʔλมߋεςʔτϝϯτ಺ͷແޮͳ ஋·ͨ͸ܽམͨ͠஋ʹରͯ͠Τϥʔ͕ൃੜ͠ ·͢ɻεςʔτϝϯτ͸தࢭ͞Εͯϩʔϧόο Ϋ͞Ε·͢ɻ
  8. ~MySQL5.5, MySQL5.6~ • STRICT_TRANS_TABLES(5.6~) • ஋Λࢦఆͨ͠ͱ͓ΓʹτϥϯβΫγϣϯςʔϒϧʹૠೖͰ͖ͳ͍৔߹ɺ εςʔτϝϯτΛதࢭ͠·͢ɻ • NO_ENGINE_SUBSTITUTION(5.6.6~) •

    CREATE TABLE ·ͨ͸ ALTER TABLE ͳͲͷεςʔτϝϯτ͕ແޮ·ͨ ͸ίϯύΠϧ͞Ε͍ͯͳ͍ετϨʔδΤϯδϯΛࢦఆͨ͠ͱ͖ɺ໨తͷ Τϯδϯ͕ར༻Ͱ͖ͳ͍৔߹ʹΤϥʔ͕ൃੜ MySQL5.6͸ઃఆͷσϑΥϧτ஋͕5.5ͱҧ͏ at softelϝϞ MySQL5.6ʹ͍͔ͯͭ͘͠ͷSQLͰΤϥʔ͕ग़ΔΑ͏ʹͳͬͨ
  9. ֬ೝํ๏ʢͲͪΒ΋MySQL5.6.20~ʣ ! • ී௨͜͏ˣͳΔɹɹɹɹɹ ๭ Ξ ϓ Ϧ

  10. ૊Έ߹ΘͤͰҰׅࢦఆ • ૊Έ߹Θͤ SQL Ϟʔυ • ଞDBαʔόͷΤϛϡϨʔτ • DB2, MSSQL,

    ORACLE, POSTGRESQL, etc… • TRADITIONAL(ݫ֨Ϟʔυ+α) • 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
  11. ݁ہԿ͕ྑ͍ͷ͞ʁ

  12. kamipo TRADITIONALͰ݁࿦...ʁ • ONLY_FULL_GROUP_BY • ඪ४ SQL ͷಈ࡞͕༗ޮʹͳΓ·͢ɻGROUP BY ۟Ͱ໊લ͕

    ࢦఆ͞Ε͍ͯͳ͍ΧϥϜ͸ɺू໿ؔ਺Ͱғ·ͳ͚Ε͹ɺબ୒ Ϧετ·ͨ͸ HAVING ۟Ͱ࢖༻Ͱ͖·ͤΜ • ݸਓతݟղ • ͵Δ·౬(MySQL)ͰҭͬͨͷͰͿͬͪΌ͚ෆศ • σʔλͷ੔߹ੑʹؔΘΒͳ͍ͷͰϝϦοτΛײ͡ͳ͍...
  13. inoue TRADITIONAL ! ↓ ! TRADITIONAL + NO_AUTO_VALUE_ON_ZERO

  14. Q. طʹෆਖ਼ͳ஋ೖͬͯΔ৔߹͸ʁ • ͋͘·Ͱσʔλૠೖɺߋ৽࣌ͷݕূ • 0000-00-00 00:00:00ͷϨίʔυΛೖΕͯ࠶ىಈ
 ˠ ੒ޭɻෆਖ਼ͳϨίʔυ΋࢒ͬͯΔ •

    ޙ෇ͰSQLϞʔυΛม͑Δ͜ͱ͸ՄೳͬͪΌՄೳ • ݱ࣮ • Ͱ΋ෆਖ਼ͳ஋ΛೖΕΑ͏ͱ͢ΔSQL͢΂ͯ௚͢ඞཁ͕͋Δ
  15. ·ͱΊ • ઃఆ࣍ୈͰMySQL΋͍ͩͿݻ͘Ͱ͖Δ • ৽ن͸νϟϯεɺͳΔ΂͘ݻΊઃఆͰ • DBଆͰෆਖ਼஋͸஄͘ɻຊདྷͷϩδοΫʹूதͰ͖Δ • INSERT/UPDATE IGNORE͸ͭΒ͍

    • MyISAMʢඇτϥϯβΫγϣϯςʔϒϧʣ͸ͭΒ͍
  16. ࢀߟهࣄ͞· • ϧʔΫʂMySQLͰ͸kamipo TRADITIONALΛ࢖͑ʂ • kamipo traditional (ͱ͍͏͔STRICT_ALL_TABLES) Ͱ͸๷͛ͳ͍ MyISAMͱ͍͏໊ͷԽ͚෺

    • kamipo TRADITIONALͰ͸๷͛ͳ͍INSERT IGNOREͱ͍͏໊ͷԽ͚෺