PHPerの僕がMySQLからPostgreSQL移行で学んだZeroDateアンチパターン/database_migration_zero_date_untipattern

 PHPerの僕がMySQLからPostgreSQL移行で学んだZeroDateアンチパターン/database_migration_zero_date_untipattern

【非公式】PHPカンファレンス 2018 関西 前夜祭 にて登壇して資料です。

自社サービスでDatabaseの移行をやっているのですが、その時に学んだAWSのDatabaseMigrationServiceの話であったり、ZeroDate( '0000-00-00 00:00:00') の問題について知見を共有させて頂きました。

F891bc57aad1b6bdbf344358e7fec3cc?s=128

Takahashi Ikki

July 13, 2018
Tweet

Transcript

  1. PHPerͷ๻͕MySQL͔Β PostgreSQLҠߦͰֶΜͩ ZeroDateΞϯνύλʔϯ 2018/07/13 PHPΧϯϑΝϨϯε 2018 ؔ੢ લ໷ࡇ

  2. ઌ೔ͷ஍਒ʹඃࡂ͞Εͨํ ઌ೔ͷେӍʹඃࡂ͞Εͨํ ৺͔Β͓ݟ෣͍Λਃ্͛͠·͢

  3. ͓͠ͳ͕͖

  4. ຊ೔ͷ͓඼ॻ͖ ̍ɽ ͋͹͏ͱΈʔ ̎ɽ DMS(DataBaseMigrationServices)ʹ͍ͭͯ ̏ɽ ZeroDate ͷѱເ ̐ɽ ·ͱΊ

    4
  5. ਆ( @soudai1025 )͸ ஌͍ͬͯΔ

  6. ͓ɺࠓ೔ͷ࿩ ͦʔ͍ͩͳΔΒ͕͖͘ா ʹશ෦ॻ͍ͯ͋Δ͡ΌΜ

  7. ͦʔ͍ͩͳΔΒ͕͖͘ா ϦϯΫ ʰDBϦϑΝΫλϦϯάΛ΍͍ͬͯΔͬͯ࿩ʱ https://soudai.hatenablog.com/entry/2018/05/25/121801 ʰMySQLͷ0000-00-00 00:00:00͸࢖ͬͯ͸ͳΒͳ͍ʱ https://soudai.hatenablog.com/entry/2018/05/12/191050 7

  8. ·͋ɺதͷਓͷ࿩ͬͯࣄͰ

  9. ̍ɽ͋͹͏ͱΈʔ

  10. ̍ɽ͋͹͏ͱΈʔ • ߴڮ Ұٍ ɾ ԬࢁͰWebΤϯδχΞΛͯ͠·͢ɻ ɾ PHPerɺPythonista ɹ ԬࢁϞόΠϧΞϓϦ։ൃ΋͘΋͘ձ

    Ͱ Swift ΍ͬͯΔ ɾ JPUG தࠃࢧ෦௕ ɾ ϋϦωζϛ ࣂͬͯ·͢ 10
  11. ࠂ஌ IUUQTECTUVEZDIVHPLVDPOOQBTTDPNFWFOU 11

  12. ̍ɽ͋͹͏ͱΈʔ ࠗ׆ͱ͍͑͹ ʮΦϛΧϨʯʂʂ https://party-calendar.net/ 12

  13. ̍ɽ͋͹͏ͱΈʔ ݁ࠗ͸͍͍ͧʂʂ 13

  14. ̍ɽ͋͹͏ͱΈʔ Զͨͪ͸͜ͷসإͱ޾ͤͷͻͱ࣌ͷͨΊʹ ࢓ࣄΛ͍ͯ͠Δʂʂ 14

  15. ̍ɽ͋͹͏ͱΈʔ ઈࢍɺ࠾༻தʂ https://party-calendar.net/corp/recruit 15

  16. ̎ɽDMSʹ͍ͭͯ

  17. ̎ɽDMSʹ͍ͭͯ ݱࡏɺΦϛΧϨͰ͸௕ظܭըͰ DBͷϦϑΝΫλϦϯάΛ΍ͬͯ·͢ɻ 17

  18. ̎ɽDMSʹ͍ͭͯ 18

  19. ̎ɽDMSʹ͍ͭͯ 19

  20. ̎ɽDMSʹ͍ͭͯ 20

  21. ̎ɽDMSʹ͍ͭͯ ͪͳΈʹɺDMS࢖ͬͨࣄ͋Δਓ $ʁ 21

  22. ̎ɽDMSʹ͍ͭͯ ʢ༻ޠઆ໌ʣ 22

  23. ̎ɽDMSʹ͍ͭͯʢσʔλϩʔυʣ 23

  24. ̎ɽDMSʹ͍ͭͯʢλεΫͷઃఆʣ 24 ࢦఆͨ͠εΩʔϚʹରͯ͠ ҎԼͷ৚݅ͰϨϓϦέʔγϣϯ͢ΔςʔϒϧΛࢦఆ ɾ ਖ਼نදݱΛ࢖͏ ɹuser_% ɿ user_XXXX ͬͯςʔϒϧ͚ͩର৅/ର৅֎ʹ͢Δ

    ɾ׬શҰகͰࢦఆ͢Δɻ ɹusers ɿ users ςʔϒϧ͚ͩର৅/ର৅֎ʹ͢Δ
  25. ̎ɽDMSʹ͍ͭͯ ͜ΕͰօ͞Μ %.4׬શʹϚελʔͨ͠ 25

  26. ̏ɽZeroDate ͷѱເ

  27. ̏ɽZeroDate ͷѱເ (τϦΨʔ͑͞ॻ͚Ε͹)؆୯ͦ͏ উͬͨͳΨϋϋʂ 27

  28. ̏ɽZeroDate ͷѱເ (τϦΨʔ͑͞ॻ͚Ε͹)؆୯ͦ͏ উͬͨͳΨϋϋʂ γϡο 28

  29. ̏ɽZeroDate ͷѱເ ͕ͬ……ବ໨ͬ……! ERROR: date/time field value out of range:

    "0000-00-00 00:00:00” 29
  30. ̏ɽZeroDate ͷѱເ ʊਓਓਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹlzɹʻ ʉ:?:?:?:?:?:?:?:?:?:?:?ʉ 30

  31. ̏ɽZeroDate ͷѱເ lz ɾΛڐ༰͍ͯ͠Δͷ͸.Z42-ͷΈ ɾ42-ඪ४ͱͯ͠͸͕࠷খͷൣғ ɾ8)&3&IPHF@EBUF*4/6--Λ౤͛Δͱ IPHF@EBUF͕ͷౕ͕Ҿ͔͔ͬΔ IPHF@EBUFJTOPUOVMMͰ΋ 31

  32. ̏ɽZeroDate ͷѱເ ৭ʑͳબ୒എܠ͸͋Δ ϝϦοτ΋͋Δ͠σϝϦοτ΋͋Δ ͦΕ͕ࠓճҟछ%#ҠઃʹΑͬͯݦࡏԽ͚ͨͩ͠ 32

  33. ̏ɽZeroDate ͷѱເ ରॲ̍ #&'03&*/4&35τϦΨʔΛ࢓ࠐΉ ೔࣌b`ͩͬͨΒ /08 ͱ͔ʹม׵͢Δɻ 33

  34. ̏ɽZeroDate ͷѱເ ͕ͬ……ବ໨ͬ……! ERROR: date/time field value out of range:

    "0000-00-00 00:00:00” 34
  35. ̏ɽZeroDate ͷѱເ ʊਓਓਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹlzɹʻ ʉ:?:?:?:?:?:?:?:?:?:?:?ʉ 35

  36. ̏ɽZeroDate ͷѱເ */4&35ॲཧ࣌ʹlzΛ EBUFUJNFܕʹม׵͠Α͏ͱͯ͠ΤϥʔʹͳΔɻ ͦ΋ͦ΋*/4&35ॲཧ͕ίέΔͷͰ #&'03&*/4&35τϦΨʔ͕૸Βͳ͍ɻ 36

  37. ̏ɽZeroDate ͷѱເ 37

  38. ̏ɽZeroDate ͷѱເ ରॲ̎ EBUFUJNFܕͷΧϥϜΛWBSDIBSܕʹม͑Δɻ 38

  39. ̏ɽZeroDate ͷѱເ ͍ͱ͓͔͠ 39

  40. ̏ɽZeroDate ͷѱເ ྲྀΕͨ 40

  41. ̏ɽZeroDate ͷѱເ ͜ΕΛºඞཁͳςʔϒϧ਺΍Ε͹ղܾ ΊͰͨ͠ΊͰͨ͠ 41

  42. ̏ɽZeroDate ͷѱເ (ରॲํ๏) .Z42-Ҏ߱ ;FSP%BUFΛڐ༰͠ͳ͍ઃఆ͕σϑΥϧτ ෆ༻ҙʹ৮Βͳ͍ࣄେ੾ 42

  43. ̏ɽZeroDate ͷѱເ (ରॲํ๏) ͳ͓ɺ"NB[PO"VSPSB .Z42-ޓ׵  43

  44. ̏ɽZeroDate ͷѱເ (ରॲํ๏) TRM@NPEFΛద੾ʹઃఆ͍ͯ͘͠ࣄ͕େࣄ 44

  45. ·ͱΊ

  46. ̐ɽ·ͱΊ %.4΋ສೳͰ͸ແ͍ $%$ͷ৔߹ɺτϥϯβΫγϣϯϩά͕ ࡟আ͞ΕͯΔͱ࠶։ग़དྷͳ͍ %.4ΛϩʔΧϧ؀ڥʹ࠶ݱग़དྷͳ͍ ˢ͜ͷ஌ݟ΋ͬͯΔਓڭ͑ͯཉ͍͠ʂ 46

  47. ̐ɽ·ͱΊ ࢓্༷ͷ໰୊͕ग़ͨͱ͖ ͙͢Ϋιͬͯݴ͍͕ͪ ˞ݸਓͷମݧͰ͢ 47

  48. ̐ɽ·ͱΊ ࢓্༷ͷ໰୊͕ग़ͨͱ͖ ͙͢Ϋιͬͯݴ͍͕ͪ ˞ݸਓͷҙݟͰ͢ 48

  49. ̐ɽ·ͱΊ ΦϛΧϨ ʮ໰୊఺l՝୊zʯ ͑ʁ͡Ό͋ͦͷ՝୊ΛԶ͕ղܾ͢Ε͹ αʔϏε΋ͬͱྑ͘ͳΔ͡ΌΜʁ 49

  50. ̐ɽ·ͱΊ ՝୊ղܾʹ͸ٕज़ྗ͕ඞཁෆՄܽ 50

  51. ̐ɽ·ͱΊ 51 ΑΓྑ͍Πϯϓοτ͕େ੾ 1)1ΧϯϑΝϨϯεؔ੢ ָ͠Έ·͠ΐ͏ʂ

  52. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠