前書き
MySQL 5.7は、人気のあるオープンソースデータベースの最新のリリース候補です。 それはあなたが変更を行うことに熱心でなければならない新しいスケーラビリティ機能を提供します。
変更の1つを強調するために、スケーラビリティが大幅に改善されました。 ハイエンドでは、MySQL 5.7は48コアサーバーで直線的にスケーリングします。 ローエンドでは、MySQL 5.7は、512 MBのDigitalOcean Droplet(MySQL 5.6の構成を変更しないと不可能だったもの)でもそのまま使用できます。
MySQLサーバーの新しいピークパフォーマンスは1秒あたり640Kクエリを超え、InnoDBストレージエンジンと直接通信するmemcached APIはhttps://blogs.oracle.com/mysqlinnodb/entry/mysql_5_7_3_deep[over 1秒あたり110万リクエスト]。
急いで「+ mysql_upgrade」を実行する前に、準備が整っていることを確認する必要があります。 このチュートリアルは、まさにそれを行うのに役立ちます。
データ整合性の変更、例付き
MySQL 5.7での大きな変更点の1つは、ベテランの開発者とDBAが期待するものとより一致するようにデータの整合性が改善されたことです。 以前は、MySQLは誤った値を可能な限り最も近い正しい値に調整していましたが、新しいデフォルトでは代わりにエラーを返します。
MySQL 5.7ですぐに機能するために変更が必要なクエリの5つの例を次に示します。 アプリケーションはこれらの動作のいずれかを使用していますか?
[[1-inserting-a-negative-value-into-an-unsigned-column]] ==== 1)負の値を符号なしの列に挿入する
符号なしの列を持つテーブルを作成します。
CREATE TABLE test (
id int unsigned
);
負の値を挿入します。
以前の動作:
INSERT INTO test VALUES (-1);
Query OK, 1 row affected, 1 warning (0.01 sec)
MySQL 5.7:
INSERT INTO test VALUES (-1);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
[[2-division-by-zero]] ==== 2)ゼロ除算
テストテーブルを作成します。
CREATE TABLE test2 (
id int unsigned
);
ゼロで除算しようとしました。
以前の動作:
INSERT INTO test2 VALUES (0/0);
Query OK, 1 row affected (0.01 sec)
MySQL 5.7:
INSERT INTO test2 VALUES (0/0);
ERROR 1365 (22012): Division by 0
[[3-inserting-a-20-character-string-into-a-10-character-column]] ==== 3)20文字の文字列を10文字の列に挿入する
10文字の列を持つテーブルを作成します。
CREATE TABLE test3 (
a varchar(10)
);
長い文字列を挿入してみてください。
以前の動作:
INSERT INTO test3 VALUES ('abcdefghijklmnopqrstuvwxyz');
Query OK, 1 row affected, 1 warning (0.00 sec)
MySQL 5.7:
INSERT INTO test3 VALUES ('abcdefghijklmnopqrstuvwxyz');
ERROR 1406 (22001): Data too long for column 'a' at row 1
[[4-inserting-the-non-standard-zero-date-into-a-datetime-column]] ==== 4)非標準のゼロ日付を日時列に挿入する
日時列を持つテーブルを作成します。
CREATE TABLE test3 (
a datetime
);
`+ 0000-00-00 00:00:00 +`を挿入します。
以前の動作:
INSERT INTO test3 VALUES ('0000-00-00 00:00:00');
Query OK, 1 row affected, 1 warning (0.00 sec)
MySQL 5.7:
INSERT INTO test3 VALUES ('0000-00-00 00:00:00');
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'a' at row 1
[[5-using-group-by-and-selecting-an-ambiguous-column]] ==== 5)GROUP BYを使用して、あいまいな列を選択する
これは、説明が「+ GROUP BY 」の一部ではなく、それに適用される集計関数(「 MIN 」や「 MAX +」など)がない場合に発生します。
前の動作:
SELECT id, invoice_id, description FROM invoice_line_items GROUP BY invoice_id;
+----+------------+-------------+
| id | invoice_id | description |
+----+------------+-------------+
| 1 | 1 | New socks |
| 3 | 2 | Shoes |
| 5 | 3 | Tie |
+----+------------+-------------+
3 rows in set (0.00 sec)
MySQL 5.7:
SELECT id, invoice_id, description FROM invoice_line_items GROUP BY invoice_id;
ERROR 1055 (42000): Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'invoice_line_items.description' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
sql_modeによって設定される動作の理解
MySQLの用語では、前のセクションで示した各動作は、「+ sql_mode +」と呼ばれるものの影響を受けます。
この機能はMySQL 4.1(2004)でデビューしましたが、デフォルトではコンパイルされていません。 MySQL 5.7では、デフォルトで次のモードが有効になっています。
-
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by [
+ ONLY_FULL_GROUP_BY +
] -
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_trans_tables [
+ STRICT_TRANS_TABLES +
] -
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_engine_substitution [
+ NO_ENGINE_SUBSTITUTION +
] -
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_auto_create_user [
+ NO_AUTO_CREATE_USER +
]
モードhttp://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_trans_tables [+ STRICT_TRANS_TABLES +
]もより厳密になり、モードhttpで以前に指定された動作を有効にします。 //dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_error_for_division_by_zero[ERROR_FOR_DIVISION_BY_ZERO
]、http://dev.mysql.com/doc/refman/5.7/en/sql- mode.html#sqlmode_no_zero_date [+ NO_ZERO_DATE +
]およびhttp://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_in_date [+ NO_ZERO_IN_DATE +
]。
これらのモード名のいずれかをクリックして、MySQLマニュアルにアクセスし、詳細を確認してください。
移行方法に関する提案
Wordpress、Drupal、またはMagentoの最新バージョンを使用している場合、良いことは何もする必要がないことです。 これらのアプリケーションは、MySQLの「+ sql_mode +」機能をすでに認識しており、MySQLに接続すると、互換性のあるオプションが設定されます。
現在*新しいアプリケーションを構築中*の場合、MySQL 5.7に同梱されている `+ sql_mode +`設定で動作するように、既存のMySQL 5.6サーバーの設定を変更することをお勧めします。
*既存のアプリケーション*を使用している場合は、更新をより段階的に進めたい場合があります。 これらの提案は、移行に役立つ場合があります。
-
* http://en.wikipedia.org/wiki/Whitelist [Whitelist] *:アプリケーションの新しい部分で、新しいデフォルトの<tt> sqlmode </ tt>オプションを有効にします。 たとえば、データのキャッシュを再構築するために一連のcronジョブを構築している場合、これらはMySQLに接続するとすぐに<tt> sqlmode </ tt>を設定できます。 既存のアプリケーションコードは、最初は既存の非厳密な動作を維持できます。
-
* http://en.wikipedia.org/wiki/blacklist [Blacklist] *:アプリケーションの変換にある程度の準備ができたら、新しい<tt> sqlmode </ tt>をサーバーのデフォルトに設定します。 MySQLに接続するときに
sql
mode