Open3

MySQL 5.7 → MySQL 8.0

tetsuya28tetsuya28

破壊的変更

Remove the syntax for GROUP BY ASC and DESC

https://dev.mysql.com/worklog/task/?id=8693

Incompatible change: As of MySQL 8.0.13, the deprecated ASC or DESC qualifiers for GROUP BY clauses have been removed. Queries that previously relied on GROUP BY sorting may produce results that differ from previous MySQL versions. To produce a given sort order, provide an ORDER BY clause.

適当にテーブル作る。

CREATE TABLE `samples` (
  `id` int(11) DEFAULT NULL,
  `name` text
)

いくつかデータを突っ込んでおく。

mysql> SELECT * FROM samples;
+------+------+
| id   | name |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    4 | ddd  |
|    5 | eee  |
|    4 | dddd |
+------+------+

MySQL 5.7 では実行できる。

mysql> SELECT id FROM samples GROUP BY id ASC;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
5 rows in set, 1 warning (0.00 sec)

MySQL 8.0 では実行できない。

mysql> SELECT id FROM samples GROUP BY id ASC;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC' at line 1

ORDER BY 付けたら実行できる。

mysql> SELECT id FROM samples GROUP BY id ORDER BY id ASC;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
5 rows in set (0.01 sec)

また、暗黙ソートも MySQL 8.0 からしなくなる。
https://yoku0825.blogspot.com/2018/11/mysql-80group-by.html

___

Incompatible change: In MySQL 5.7, specifying a FOREIGN KEY definition for an InnoDB table without a CONSTRAINT symbol clause, or specifying the CONSTRAINT keyword without a symbol, causes InnoDB to use a generated constraint name. That behavior changed in MySQL 8.0, with InnoDB using the FOREIGN KEY index_name value instead of a generated name. Because constraint names must be unique per schema (database), the change caused errors due to foreign key index names that were not unique per schema. To avoid such errors, the new constraint naming behavior has been reverted in MySQL 8.0.16, and InnoDB once again uses a generated constraint name.

___

Incompatible change: MySQL 8.0.28 fixes an issue in previous MySQL 8.0 releases whereby the CONVERT() function sometimes allowed invalid casts of BINARY values to nonbinary character sets. Applications which may have relied on this behavior should be checked and if necessary modified prior to upgrade.

tetsuya28tetsuya28

Index too long

MySQL 5.7 → MySQL 8.0 ではなく、 uft8 → uft8mb4 での影響。
https://blog.e2info.co.jp/2017/04/17/mysqlのインデックスサイズに767byteまでしかつかえない/

UTF-8は1文字が3バイトのため、varchar(255)は、255文字✕3バイト=765バイトということで、問題なくインデックスを設定することができていました。
utf8mb4は、1文字が4バイトとしてあつかわれるため、制限の767バイトを超過してしまい、MySQLのエラーが出力されるようになりました。

File format 次第では上記問題は起きない。
MySQL 5.6 までで Antelope を利用して、そのまま利用していると影響を受ける可能性はある。

MySQL5.7からは標準で、innodb_file_formatはBarracuda

Row format が REDUNDANT の場合に起きる?
https://dev.mysql.com/doc/refman/8.0/ja/data-size.html

COMPACT / DYNAMIC / COMPRESSED をコンパクトファミリーと呼ぶ。

Antelope で REDUNDANT / COMPACT が利用できる。
Barracuda で DYNAMIC / COMPRESSED が利用できる。

innodb_large_prefix オプションを有効化すると 3072bytes まで拡張することができる。
このオプションを有効化するには row_format を DYNAMIC or COMPRESSED ( = file_format ) にする必要がある。