Help us understand the problem. What is going on with this article?

MySQL5.7.9を試した

More than 5 years have passed since last update.

10/26リリースでアナウンスされていた5.7.9が、10/22にGAとしてリポジトリに登録されたのでインストール。
CentOS6に新規インストールして、5.7.8RC2で試していた内容を再確認。

インストール&起動

http://dev.mysql.com/downloads/repo/yum/
からリポジトリファイルを取得してインストール

# rpm -ivh mysql57-community-release-el6-7.noarch.rpm
準備中...                ########################################### [100%]
   1:mysql57-community-relea########################################### [100%]

パッケージを取得します。
# yum install mysql-community-client      \
              mysql-community-common      \
              mysql-community-devel       \
              mysql-community-libs        \
              mysql-community-libs-compat \
              mysql-community-server

読み込んだプラグイン:fastestmirror, refresh-packagekit, security
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp

~中略~

インストール:
  mysql-community-client.x86_64 0:5.7.9-1.el6
  mysql-community-common.x86_64 0:5.7.9-1.el6
  mysql-community-devel.x86_64 0:5.7.9-1.el6
  mysql-community-libs.x86_64 0:5.7.9-1.el6
  mysql-community-libs-compat.x86_64 0:5.7.9-1.el6
  mysql-community-server.x86_64 0:5.7.9-1.el6

完了しました!

起動します。
# /etc/init.d/mysqld start
MySQL データベースを初期化中:                              [  OK  ]
mysqld を起動中:                                           [  OK  ]

パスワード変更

まずは初期パスワード(temporary password )の確認

/var/log/mysqld.log
2015-10-22T01:45:23.042474Z 1 [Note] A temporary password is generated for root@localhost: x=)BeC*83ceY

この値でログインします。

$ mysql -u root -p'x=)BeC*83ceY'

パスワードを変更します。
mysql >ALTER USER 'root'@'localhost' IDENTIFIED BY 'Your_passw0rd';

または
mysql> set PASSWORD='Your_passw0rd';

※PASSWORD関数を使用せずに、そのまま渡すように変わりました。
ポリシーの初期値はMEDIUMとなっており、
  • 大文字/小文字/数字/記号の全てが入っている
  • 長さが8文字以上

を満たす必要があります。

パラメータの初期値確認

デフォルトのままで確認します。

/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

●validate_password_policy

mysql> select @@validate_password_policy;
+----------------------------+
| @@validate_password_policy |
+----------------------------+
| MEDIUM                     |
+----------------------------+

●innodb_file_format

mysql> show variables like 'innodb_file_format%';
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| innodb_file_format       | Barracuda |
| innodb_file_format_check | ON        |
| innodb_file_format_max   | Barracuda |
+--------------------------+-----------+

Barracudaになりました。

●tx_isolation

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

残念ながら、READ-COMMITTEDにはならず…

●explicit_defaults_for_timestamp

mysql> show variables LIKE 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF   |
+---------------------------------+-------+

●sql_mode

mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+

増えすぎだろw

●default_password_lifetime

mysql> select @@default_password_lifetime;
+-----------------------------+
| @@default_password_lifetime |
+-----------------------------+
|                         360 |
+-----------------------------+

絶対に後からはまるので、/etc/my.cnf に

default_password_lifetime = 0

を追加しておくことにします。

●log_warnings

mysql> select @@log_warnings;
+----------------+
| @@log_warnings |
+----------------+
|              2 |
+----------------+

●secure_file_priv

mysql> select @@secure_file_priv;
+-----------------------+
| @@secure_file_priv    |
+-----------------------+
| /var/lib/mysql-files/ |
+-----------------------+

generated columnを持つテーブルのmysqldump

mysql> create database test;
mysql> use test;

generated columnを持つテーブルを作成します。

mysql> CREATE TABLE test2
    ->   (A int,
    ->    B int,
    ->    C double AS (A + B) NOT NULL
    ->   );
Query OK, 0 rows affected (0.04 sec)

mysql> DESC test2;
+-------+---------+------+-----+---------+-------------------+
| Field | Type    | Null | Key | Default | Extra             |
+-------+---------+------+-----+---------+-------------------+
| A     | int(11) | YES  |     | NULL    |                   |
| B     | int(11) | YES  |     | NULL    |                   |
| C     | double  | NO   |     | NULL    | VIRTUAL GENERATED |
+-------+---------+------+-----+---------+-------------------+
3 rows in set (0.07 sec)

mysql> INSERT INTO test2 (A,B) VALUES(1,2);
mysql> COMMIT;
mysql> SELECT * FROM test2;
+------+------+---+
| A    | B    | C |
+------+------+---+
|    1 |    2 | 3 |
+------+------+---+
1 row in set (0.00 sec)

このテーブルのダンプを取得します。
$ mysqldump -uroot -p test test2
Enter password:

-- MySQL dump 10.13  Distrib 5.7.9, for Linux (x86_64)

-- Host: localhost    Database: test



-- Server version       5.7.9

/!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;
/!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;
/!40101 SET NAMES utf8 /;
/!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE /;
/!40103 SET TIME_ZONE='+00:00' /;
/!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 /;
/!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 /;
/!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' /;
/!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--

-- Table structure for table test2

DROP TABLE IF EXISTS test2;
/!40101 SET @saved_cs_client     = @@character_set_client */;
/!40101 SET character_set_client = utf8 /;
CREATE TABLE test2 (
  A int(11) DEFAULT NULL,
  B int(11) DEFAULT NULL,
  C double GENERATED ALWAYS AS (A + B) VIRTUAL NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/!40101 SET character_set_client = @saved_cs_client */;

--

-- Dumping data for table test2

LOCK TABLES test2 WRITE;
/!40000 ALTER TABLE test2 DISABLE KEYS */;
INSERT INTO test2 (A, B) VALUES (1,2);
/!40000 ALTER TABLE test2 ENABLE KEYS /;
UNLOCK TABLES;
/!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS /;
/!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS /;
/!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT /;
/!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS /;
/!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION /;
/!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2015-10-22 14:15:49

ということで、めでたくgenerated columnの'C'がINSERT文に含まれないようになりました。
※generated columnへのINSERTはできないので、RCのときにはダンプからのインポート時にエラーになっていました。

ゼロ日付の扱いの変更

CREATE TABLE `mytable` ( 
`id` int(10) unsigned NOT NULL, 
`field2` tinyint(3) unsigned NOT NULL, 
`last_change` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
);


CREATE TABLE `mytable2` ( 
`id` int(10) unsigned NOT NULL, 
`field2` tinyint(3) unsigned NOT NULL, 
`last_change_dt` date NOT NULL DEFAULT '0000-00-00'
);

いずれもMySQL5.6:OK、MySQL5.7:NGです。
※sql_modeが初期値の場合

ついでに2038年問題の日付

SET SESSION time_zone='+0:00';
CREATE TABLE `mytable` ( 
`id` int(10) unsigned NOT NULL, 
`field2` tinyint(3) unsigned NOT NULL, 
`last_change` timestamp NOT NULL DEFAULT '2038-01-19 03:14:08'
);

MySQL5.6、MySQL5.7ともNGです。

JSONサポート

適当にデータ突っ込みました

mysql> CREATE TABLE test1 (jsontext JSON);
mysql> desc test1;
+----------+------+------+-----+---------+-------+
| Field    | Type | Null | Key | Default | Extra |
+----------+------+------+-----+---------+-------+
| jsontext | json | YES  |     | NULL    |       |
+----------+------+------+-----+---------+-------+

mysql> INSERT INTO test1 (jsontext) VALUES ('{"key1":"A","key2":3}');
mysql> INSERT INTO test1 (jsontext) VALUES ('{"ParentKey":["A","B"]}');
mysql> INSERT INTO test1 (jsontext) VALUES ('{"P1":{"C11":"V11","C12":"V12"},"P2":{"C21":"V21","C22":"V22"}}');
mysql> SELECT * FROM test1;
+--------------------------------------------------------------------------+
| jsontext                                                                 |
+--------------------------------------------------------------------------+
| {"key1": "A", "key2": 3}                                                 |
| {"ParentKey": ["A", "B"]}                                                |
| {"P1": {"C11": "V11", "C12": "V12"}, "P2": {"C21": "V21", "C22": "V22"}} |
+--------------------------------------------------------------------------+

問題なく使えてます。
mysql> SELECT * FROM test1 WHERE json_extract(jsontext , '$.key1') = 'A';
+--------------------------+
| jsontext                 |
+--------------------------+
| {"key1": "A", "key2": 3} |
+--------------------------+

が、キー名を指定しないと、Valueだけでなくキー名もLIKEの対象になってしまう…

mysql> SELECT * FROM test1 WHERE json_extract(jsontext , '$') LIKE '%1%';
+--------------------------------------------------------------------------+
| jsontext                                                                 |
+--------------------------------------------------------------------------+
| {"key1": "A", "key2": 3}                                                 |
| {"P1": {"C11": "V11", "C12": "V12"}, "P2": {"C21": "V21", "C22": "V22"}} |
+--------------------------------------------------------------------------+
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away