MySQLの厳密モードとそれを有効にする理由

MySQLにはこのような特別なモードがあり、データベースに誤ったデータを導入するように設計されています。 たとえば、2,000,000,000の代わりにINTフィールドに2147483647を挿入します。 または、ベースに存在しない日付を入力します。 またはトリミングされた線。 さて、またはこのモードがあなたに役立つかもしれない理由をあなたは決して知りません。

このモードは「通常モード」と呼ばれます。



一見狂っているように見えますが、この動作には歴史的な理由があります。

MyISAMエンジンは、ごく最近までは以前の標準MySQLエンジンでしたが、 トランザクションをサポートしていません。 「一見アトミックな」リクエストのセットの1つが落ちた場合、ベース(一般的な場合)はその整合性を失いました。 この危険性と比較して、データベースに誤った値を書き込むことは、最も害が少ないことが判明しました。

しかし、結局のところ、有能なWeb開発者であれば、 InnoDBエンジンを使用する必要があることを知っています。これは、サイトのリポジトリのコンテキストでは、あらゆる側面のMyISAMよりも優れています。 特に、InnoDBはトランザクションをサポートしており、ある程度適切なORM(またはデータベースクエリをエンコードするライブ置換)はすべてこれらのトランザクションを使用してアトミックな変更を保証します。

したがって、InnoDBとトランザクションを使用する場合、MySQLの控えめな態度はあなたに害を与えるだけであることがわかります。 スキャンが失敗するたびに、データベースが詰まる恐れがあります。 ここに良い例があります-どのフィールドにURLを保存しますか? VARCHAR(255) ? また、 アドレスの長さは2キロバイトです 。 「通常モード」では、行がオーバーフローすると、MySQLは誰にも読み取れない警告のみをログに書き込みます。

厳格モード



MySQLモードの広範なリストから、 STRICT_TRANS_TABLESモードに興味があります。 上記で説明した内容を禁止し、不正なデータに対してエラーをスローします。

クエリの言語では、

 SET sql_mode = 'STRICT_TRANS_TABLES、NO_ZERO_DATE、NO_ZERO_IN_DATE';


もちろん、そのような変更の後、テストを実行する(ある場合)か、少なくともエラーを監視する(表示されるとおり)必要があります。

Ruby on Railsに適用されるSTRICT_TRANS_TABLESに関する結論は、私のブログで読むことができます。

Source: https://habr.com/ru/post/J116922/


All Articles