これまでの「SBメンバーズ」でのデータ新規登録・更新の不具合について。(原因が判明しました)
本日はネタ予定を変更しています。
-----
先週の水曜日から土曜日に書きました
「SBメンバーズ」でのバグについて
原因が判明しました。
技術的なネタです。
「G1予想大会」での不具合について
先週木曜日に書いたネタ
おそらくデータベースの仕様だと思うんですが
データベース上のテーブルに「デフォルト値」が設定されていない場合の挙動が
更新系データベースと参照系データベースとで異なっていました。
これまで普通に使用していたデータベース(今の更新系データベース)では
データを挿入する際、値を設定していない列に入るデータ(デフォルト値)は
’’(空文字)が標準で入りました。これは何の設定をしなくても。
んで最近インストールしたデータベース(参照系データベース)では
デフォルト値が設定されていない列に何も値をセットしないで挿入すると
エラーとなりデータが挿入されなくなりました。
「MySQL」のリファレンスマニュアルに書いてありました。
5.1.7 サーバー SQL モード
こう書いてあります。
当サイトで使用している「MySQL」というデータベース。
更新用データベースはヴァージョン5.6.17。
参照用データベースはヴァージョン5.7.8。
んで、
NO_ENGINE_SUBSTITUTION については
これを見る限りだと
テーブルの作成、もしくは変更した時のみに影響し(しかも無効なエンジンを指定した時だけ)
通常のデータの操作ではデフォルトで動きそうな感じ。
更新系データベースのmy.cnf(設定ファイル)には
sql-modeの記載をしていなかったので(前ヴァージョンからの引継ぎだったので)
たぶんデフォルトのNO_ENGINE_SUBSTITUTIONが適用されていたものと思われます。
んで、
参照系データベースのmy.cnfファイルを見てみたら…あらびっくり。
先ほどのマニュアルにある「厳密モード」で設定されているではありませんか。
厳密な SQL モード
まさにこれです。
管理人がブログに書いたことが
そのまんまリファレンスマニュアルにも書いてありました。
ということで
に変更して、先ほどデータベースの再起動を行っております。
---
もしかしたらこれまでの間
Favo馬登録とか、メールアドレスの変更とか
「SBメンバーズ」にかかわる操作で「変更できない」ということがあったかもしれません。
もしかしたら「新規メンバー登録ができない」ということもあったかもしれません。
いやぁ…参った。
久しぶりに参った。
ある意味「初歩的なミス」だよなぁ…。
アプリケーションをヴァージョンアップするときには(特にサーバの基幹部分では)
変更された内容をちゃんと把握すべきだよなぁ。
まさかこんなところに落とし穴があるとは思わなかった…。
そして…気づくのが遅すぎた…。
もう少し早くマニュアルを読めばよかったな。
皆さまには大変ご迷惑をおかけしました。
これでこれまでの不具合は解消されたと思います。
-----
明日は金曜日。
本日予定していたPOGについてのブログネタは
明日書こうと思います。
-----
先週の水曜日から土曜日に書きました
「SBメンバーズ」でのバグについて
原因が判明しました。
技術的なネタです。
「G1予想大会」での不具合について
先週木曜日に書いたネタ
おそらくデータベースの仕様だと思うんですが
データベース上のテーブルに「デフォルト値」が設定されていない場合の挙動が
更新系データベースと参照系データベースとで異なっていました。
これまで普通に使用していたデータベース(今の更新系データベース)では
データを挿入する際、値を設定していない列に入るデータ(デフォルト値)は
’’(空文字)が標準で入りました。これは何の設定をしなくても。
んで最近インストールしたデータベース(参照系データベース)では
デフォルト値が設定されていない列に何も値をセットしないで挿入すると
エラーとなりデータが挿入されなくなりました。
「MySQL」のリファレンスマニュアルに書いてありました。
5.1.7 サーバー SQL モード
こう書いてあります。
MySQL Server は異なる SQL モードで動作でき、
sql_mode システム変数の値に応じて異なるクライアントにこれらの異なるモードを適用できます。
(中略)
MySQL 5.6.6 以降でのデフォルトの SQL モードは NO_ENGINE_SUBSTITUTION で、
MySQL 5.6.5 以前では、これは空白です (モードの設定なし)。
(中略)
このマニュアルの「厳密モード」とは、
STRICT_TRANS_TABLES または STRICT_ALL_TABLES のいずれか
あるいは両方が有効なモードを意味します。
sql_mode システム変数の値に応じて異なるクライアントにこれらの異なるモードを適用できます。
(中略)
MySQL 5.6.6 以降でのデフォルトの SQL モードは NO_ENGINE_SUBSTITUTION で、
MySQL 5.6.5 以前では、これは空白です (モードの設定なし)。
(中略)
このマニュアルの「厳密モード」とは、
STRICT_TRANS_TABLES または STRICT_ALL_TABLES のいずれか
あるいは両方が有効なモードを意味します。
当サイトで使用している「MySQL」というデータベース。
更新用データベースはヴァージョン5.6.17。
参照用データベースはヴァージョン5.7.8。
んで、
NO_ENGINE_SUBSTITUTION については
CREATE TABLE または ALTER TABLE などのステートメントが
無効またはコンパイルされていないストレージエンジンを指定したとき、
デフォルトのストレージエンジンの自動置換を制御します。
ストレージエンジンは実行時にプラガブルであるため、利用できないエンジンも同様に扱われます。
無効またはコンパイルされていないストレージエンジンを指定したとき、
デフォルトのストレージエンジンの自動置換を制御します。
ストレージエンジンは実行時にプラガブルであるため、利用できないエンジンも同様に扱われます。
これを見る限りだと
テーブルの作成、もしくは変更した時のみに影響し(しかも無効なエンジンを指定した時だけ)
通常のデータの操作ではデフォルトで動きそうな感じ。
更新系データベースのmy.cnf(設定ファイル)には
sql-modeの記載をしていなかったので(前ヴァージョンからの引継ぎだったので)
たぶんデフォルトのNO_ENGINE_SUBSTITUTIONが適用されていたものと思われます。
んで、
参照系データベースのmy.cnfファイルを見てみたら…あらびっくり。
sql-mode="STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
先ほどのマニュアルにある「厳密モード」で設定されているではありませんか。
厳密な SQL モード
厳密モードは、MySQL が INSERT や UPDATE などのデータ変更ステートメントで
無効な値または欠落した値を処理する方法を制御します。
値はいくつかの理由で無効になることがあります。
たとえば、カラムに対して正しくないデータ型を持っていたり、範囲外であったりすることがあります。
値の欠落が発生するのは、挿入される新しい行の非 NULL カラムに値が含まれておらず、
そのカラムに明示的な DEFAULT 句が定義されていない場合です。
(NULL カラムの場合、値が欠落しているときは NULL が挿入されます。)
(中略)
非トランザクションテーブルの場合、
挿入または更新される最初の行に不適切な値があるとき、
どちらのモードでも動作は同じになり、ステートメントが中止されて、
テーブルはそのまま変更されません。
無効な値または欠落した値を処理する方法を制御します。
値はいくつかの理由で無効になることがあります。
たとえば、カラムに対して正しくないデータ型を持っていたり、範囲外であったりすることがあります。
値の欠落が発生するのは、挿入される新しい行の非 NULL カラムに値が含まれておらず、
そのカラムに明示的な DEFAULT 句が定義されていない場合です。
(NULL カラムの場合、値が欠落しているときは NULL が挿入されます。)
(中略)
非トランザクションテーブルの場合、
挿入または更新される最初の行に不適切な値があるとき、
どちらのモードでも動作は同じになり、ステートメントが中止されて、
テーブルはそのまま変更されません。
まさにこれです。
管理人がブログに書いたことが
そのまんまリファレンスマニュアルにも書いてありました。
ということで
sql-mode=""
に変更して、先ほどデータベースの再起動を行っております。
---
もしかしたらこれまでの間
Favo馬登録とか、メールアドレスの変更とか
「SBメンバーズ」にかかわる操作で「変更できない」ということがあったかもしれません。
もしかしたら「新規メンバー登録ができない」ということもあったかもしれません。
いやぁ…参った。
久しぶりに参った。
ある意味「初歩的なミス」だよなぁ…。
アプリケーションをヴァージョンアップするときには(特にサーバの基幹部分では)
変更された内容をちゃんと把握すべきだよなぁ。
まさかこんなところに落とし穴があるとは思わなかった…。
そして…気づくのが遅すぎた…。
もう少し早くマニュアルを読めばよかったな。
皆さまには大変ご迷惑をおかけしました。
これでこれまでの不具合は解消されたと思います。
-----
明日は金曜日。
本日予定していたPOGについてのブログネタは
明日書こうと思います。
[コメント読む(0)]
