20190211のMySQLに関する記事は7件です。

PHPで入力フォームのデータをSELECT文のINSERTを使って、MySQLに書き込む

以下の2つソースコードを作ります。
①入力フォーム
②入力フォームで入力されたデータをPOSTで受け取って、DBに接続して書き込む

↓入力フォーム画面
キャプチャ.PNG

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="description" content="このページの説明">
  <title>このページのタイトル</title>
  <link rel="stylesheet" href="/main.css">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>
<body>
<div id="post_page">
  <form method="post" action="process_post.php">
    <div>name <input type="text" name="name" size="30"></div>
    <div>category <input type="text" name="category" size="30"></div>
    <div>description <textarea name="description" cols="30" rows="10"></textarea></div>
    <div><input type="submit" name="submit" value="投稿" class="button"></div>
  </form>
</div>
</body>
</html>

↓登録・登録結果表示画面

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="description" content="このページの説明文">
  <title>このページのタイトル</title>
  <link rel="stylesheet" href="/main.css">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>
<body>

<?php
  try {
    //DB名、ユーザー名、パスワード
    $dsn = 'mysql:dbname=データベース名;host=サーバー名';
    $user = 'ユーザー名';
    $password = 'パスワード';

    $PDO = new PDO($dsn, $user, $password); //MySQLのデータベースに接続
    $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //PDOのエラーレポートを表示

    //input_post.phpの値を取得
    $name = $_POST['name'];
    $category = $_POST['category'];
    $description = $_POST['description'];


    $sql = "INSERT INTO contents (name, category, description) VALUES (:name, :category, :description)"; // INSERT文を変数に格納。:nameや:categoryはプレースホルダという、値を入れるための単なる空箱
    $stmt = $dbh->prepare($sql); //挿入する値は空のまま、SQL実行の準備をする
    $params = array(':name' => $name, ':category' => $category, ':description' => $description); // 挿入する値を配列に格納する
    $stmt->execute($params); //挿入する値が入った変数をexecuteにセットしてSQLを実行

    echo "<p>name: ".$name."</p>";
    echo "<p>category: ".$category."</p>";
    echo "<p>description: ".$description."</p>";
    echo '<p>で登録しました。</p>'; // 登録完了のメッセージ
  } catch (PDOException $e) {
  exit('データベースに接続できませんでした。' . $e->getMessage());
  }

?>
</body>
</html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SQLをオンラインで試せるサービス

使ったことがあるものをまとめてみました。
SQL Fiddleは、落ちてることが多いですが、他は安定してます。

01 SQL Fiddle

http://sqlfiddle.com/

Oracle11gR2XE
PostgreSQL 9.6
MySQL 5.7

02 rextester.com

https://rextester.com/

Oracle11gR2XE
Sql Server 2014 Express Edition
PostgreSQL 9.6
MySQL 5.7.12

03 DB Fiddle

https://www.db-fiddle.com/

MySQL8.0.10
PostgreSQL10.0

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[SQL入門] 営業向けSQL勉強会やってみた vol.1

イントロ

営業戦略を立てる上で顧客データや行動を知るのは大事ですよね。僕の勤めている会社でも営業の方から〇〇のデータが欲しい、xxの現状を知りたいとお願いされることがあります。今回はそんな営業の方達が簡単なデータなら自分たちでいつでも調べられるように、社内で営業向けSQL勉強会を開いた際の手順を投稿させていただきます。

*僕が勤めている会社の社内勉強会は1回あたり1時間なので、複数回開催。この記事は第1回目の勉強会が終わった時点で投稿しています。


第1回目を終えた感想

ちょっと早いですが、最初に勉強会を開催してみての感想を書きます。

良かった点

  • 内容を絞ったので営業の方たちにスムーズにすすめてもらえた。
  • ハンズオン形式が好評で、自分でデータを取得できる快感に目覚めてもらえた。
  • 後日、「こんなデータ取れませんかね?」と営業活動に活かせてもらえた。

3つ目のクエリは流石に僕が書きましたが、データに興味を持ってもらえたのは大きな進歩かなと思いました!

悪かった点

  • PC操作に慣れていない点を十分考慮できなかった。
  • 英語に不慣れであった点を考慮できなかった。

普段の仕事ではPC & 英語に慣れている人が大半なので、もうちょっと考慮すべきでした。
主にぶつかった点は、
① コピペで練習問題をすすめてしまった人がちらほら。(写経して体で覚えてほしかった)
② 半角、全角の区別。(主にスペースでエラーになってしまう人がちらほら)

第2回目の勉強会では以上の点を反省して進めていきたいと思いました。
みなさんも自社で勉強会を開催する際は十分配慮してあげてください。


勉強会の進め方

以下の手順で勉強会を進めました。

  1. 簡単な構成のDB、本番DBを用意
  2. SQLの概要説明
  3. 簡単な構成のDBでselect文の講義
  4. 簡単な構成のDBを用いて練習問題
  5. 問題の解答、解説
  6. トピック(select, where, order, etc...)を変えて 3~5の繰り返し
  7. 本番DBを用いて、各トピックの問題を出題
  8. 問題の解答、解説
  • 本番DBへはRead権限でアクセスできるように設定。

環境

MySQL 5.7.24


事前準備

営業の方が各自のPCでセットアップする必要がないように、僕の会社ではRe:dashでDBへアクセスできる環境を整えました。

https://redash.io/

第1回目の講義に使うDBのSQLは以下。
データは各自適当なものをinsertしてください。

-- データベースの作成
CREATE DATABASE sales_practice_database;

-- データベースの選択
USE sales_practice_database;

-- テーブルの作成
CREATE TABLE users (
id BIGINT NOT NULL,
name VARCHAR(255) NOT NULL,
created DATETIME NOT NULL,
modified DATETIME,
PRIMARY KEY (id)
);
CREATE TABLE posts (
id BIGINT NOT NULL,
comments VARCHAR(255),
created DATETIME NOT NULL,
modified DATETIME,
PRIMARY KEY (id)
);

-- データの登録
INSERT INTO users
 VALUES (1, "田中太郎", "2019-02-01", "2019-02-12"),
 (2, "安川小太郎", "2019-02-02", "2019-02-10"),
 (3, "緑安江", "2019-02-03", "2019-02-03"),
 (4, "竜崎かなえ", "2019-02-04", "2019-02-11"),
 (5, "田中聡", "2019-02-05", "2019-02-05");
INSERT INTO posts
 VALUES (1, "こんにちは", "2019-02-01", "2019-02-02"),
 (2, "おはよう", "2019-02-02", "2019-02-02"),
 (3, "こんばんわ", "2019-02-03", "2019-02-03"),
 (4, "お腹空いた", "2019-02-04", "2019-02-04"),
 (5, "バイバイ", "2019-02-05", "2019-02-05");

usersテーブル

+----+-----------------+---------------------+---------------------+
| id | name            | created             | modified            |
+----+-----------------+---------------------+---------------------+
|  1 | 田中太郎        | 2019-02-01 00:00:00 | 2019-02-12 00:00:00 |
|  2 | 安川小太郎      | 2019-02-02 00:00:00 | 2019-02-10 00:00:00 |
|  3 | 緑安江          | 2019-02-03 00:00:00 | 2019-02-03 00:00:00 |
|  4 | 竜崎かなえ      | 2019-02-04 00:00:00 | 2019-02-11 00:00:00 |
|  5 | 田中聡          | 2019-02-05 00:00:00 | 2019-02-05 00:00:00 |
+----+-----------------+---------------------+---------------------+

postsテーブル

+----+-----------------+---------------------+---------------------+
| id | comments        | created             | modified            |
+----+-----------------+---------------------+---------------------+
|  1 | こんにちは      | 2019-02-01 00:00:00 | 2019-02-02 00:00:00 |
|  2 | おはよう        | 2019-02-02 00:00:00 | 2019-02-02 00:00:00 |
|  3 | こんばんわ      | 2019-02-03 00:00:00 | 2019-02-03 00:00:00 |
|  4 | お腹空いた      | 2019-02-04 00:00:00 | 2019-02-04 00:00:00 |
|  5 | バイバイ        | 2019-02-05 00:00:00 | 2019-02-05 00:00:00 |
+----+-----------------+---------------------+---------------------+

以下のコンテンツを読む前に

ここからは実際の講義用いた内容を使用して進めていきます。
その際には以下の点について注意していただけたらなと思います。

  • RDBMSを前提とした説明になっています。
  • エンジニアを対象とした講義ではないので、正確な表現よりもわかりやすさを重視した表現を用いています。
  • この記事は講義の資料としても使用しました。多少追記していますが解説で補っている箇所もあります。ご自身で読み進める方は不明瞭な箇所は適宜調べながらすすめてください。
  • 初心者の方はわからなければすぐ解答を確認してみてください、この記事には考えるような問題は載っていません。
  • 本番DBの練習問題は社外秘なので記事には載せていません。

SQLとは

保存されたデータを取り出すためのコンピュータ言語
以下の4つを覚えれば簡単なデータを取得できるようになります。

  1. テーブル
  2. レコード
  3. カラム
  4. データベース

テーブル

データの保存先です。1つのテーブルは意味のあるデータの集合体となっています。
多くのシステムは複数のテーブルで構成されています。

エクセルやスプレッドシートでは
表みたいなものです。

レコード

テーブルの横1行のデータです。例えばusersテーブルというユーザの情報を保存するテーブルがあるとすると、usersテーブルの1レコードはユーザ1人のデータを表します。

エクセルやスプレッドシートでは
行みたいなものです。

カラム

テーブルの縦1列のデータです。例えばusersテーブルの名前を保存するnameカラムは、すべてのユーザの氏名のデータを表します。

エクセルやスプレッドシートでは
列みたいなものです。

データベース(DB)

意味のあるテーブルの集合体です。

また、SQLは大文字小文字の区別がありません。載せている解説はわかりやすいようにSQL固有の単語(命令)を大文字として表示しています。


練習環境

練習するデータベースとして以下の環境を用意しました。今回は第1回の講義なので、簡易的なテーブル構成を用意しました。
イメージとしては、写真もいいねもフォローもできないインスタグラムを思い浮かべてください。
sales_sql_er.png

  • usersテーブル: ユーザのデータを保存するテーブル

    • id: usersテーブル上で一意となる番号、システム的な値を保存するカラム
    • name: ユーザの名前が保存されているカラム
    • created: ユーザが作成された日時を保存するカラム
    • modified: ユーザデータが変更された日時を保存するカラム
  • postsテーブル: ユーザの投稿を保存するテーブル

    • id: postsテーブル上で一意となる番号、システム的な値を保存するカラム
    • comments: 投稿内容を保存するカラム
    • created: 投稿が作成された日時を保存するカラム
    • modified: 投稿が変更された日時を保存するカラム

データの取得: SELECT, FROM

SELECTは取得したいカラムを指定します。
FROMは取得したいデータがあるテーブルを指定します。

usersテーブルのidカラムの値を取得したい場合は以下のようなSQL文を書きます。

SELECT id FROM users;

結果

+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+

最後のセミコロンは絶対必要なので忘れないように注意しましょう

以下の例はusersテーブルにaddressというカラムは存在しないのでエラーになります。

// エラー
SELECT address FROM users;

また、すべてのカラムの値を知りたい場合は以下のようにアスタリスクを用いた表現を使用できます。

SELECT * FROM users;

結果

+----+-----------------+---------------------+---------------------+
| id | name            | created             | modified            |
+----+-----------------+---------------------+---------------------+
|  1 | 田中太郎        | 2019-02-01 00:00:00 | 2019-02-12 00:00:00 |
|  2 | 安川小太郎      | 2019-02-02 00:00:00 | 2019-02-10 00:00:00 |
|  3 | 緑安江          | 2019-02-03 00:00:00 | 2019-02-03 00:00:00 |
|  4 | 竜崎かなえ      | 2019-02-04 00:00:00 | 2019-02-11 00:00:00 |
|  5 | 田中聡          | 2019-02-05 00:00:00 | 2019-02-05 00:00:00 |
+----+-----------------+---------------------+---------------------+

練習問題

  1. postsテーブルのすべてのカラムの値を取得しましょう。
  2. postsテーブルのcommentsカラムの値を取得しましょう。
  3. postsテーブルのidカラムとcommentsカラムの値を取得しましょう。

解答

1. postsテーブルのすべてのカラムの値を取得しましょう。

SELECT * FROM posts;

2. postsテーブルのcommentsカラムの値を取得しましょう。

SELECT comments FROM posts;

3. postsテーブルのidカラムとcommentsカラムの値を取得しましょう。

SELECT id, comments FROM posts;

データの取得: ORDER

ORDERORDER BY {並び替えたいカラム}と指定することで取得したいデータの並び替えを指定します。
降順(DESC)と昇順(ASC)を指定できます。

usersテーブルのデータを更新日の降順(日時が新しい順)に並び替えたい場合、以下のようなSQL文になります。

SELECT * FROM users ORDER BY modified DESC;

結果

+----+-----------------+---------------------+---------------------+
| id | name            | created             | modified            |
+----+-----------------+---------------------+---------------------+
|  1 | 田中太郎        | 2019-02-01 00:00:00 | 2019-02-12 00:00:00 |
|  4 | 竜崎かなえ      | 2019-02-04 00:00:00 | 2019-02-11 00:00:00 |
|  2 | 安川小太郎      | 2019-02-02 00:00:00 | 2019-02-10 00:00:00 |
|  5 | 田中聡          | 2019-02-05 00:00:00 | 2019-02-05 00:00:00 |
|  3 | 緑安江          | 2019-02-03 00:00:00 | 2019-02-03 00:00:00 |
+----+-----------------+---------------------+---------------------+

練習問題

  1. postsテーブルのデータを更新日の新しい順で取得しましょう。
  2. usersテーブルのデータを更新日の古い順で取得しましょう。
  3. postsテーブルのデータを次の並び替え優先順位で取得しましょう。①更新日の新しい順、②idの大きい順。

解答

1. postsテーブルのデータを更新日の新しい順で取得しましょう。

SELECT * FROM posts ORDER BY modified DESC;

2. usersテーブルのデータを更新日の古い順で取得しましょう。

SELECT * FROM users ORDER BY modified ASC;

3. usersテーブルのデータを次の並び替え優先順位で取得しましょう。①更新日の新しい順、②idの大きい順。

// ②の並び替え条件は,(カンマ)で区切りましょう。
SELECT * FROM posts ORDER BY modified DESC, id DESC;

データの取得: WHERE

WHEREは取得したいデータの条件を指定します。

postsテーブルのidが5のデータを取得したい場合、以下のようなSQL文になります。

SELECT * FROM posts WHERE id = 5;

結果

+----+--------------+---------------------+---------------------+
| id | comments     | created             | modified            |
+----+--------------+---------------------+---------------------+
|  5 | バイバイ     | 2019-02-05 00:00:00 | 2019-02-05 00:00:00 |
+----+--------------+---------------------+---------------------+

また、LIKEは文字列の検索をする際に使用できます。
さらに%をつけると、そこに任意の0文字以上の文字列があることを表現します。
usersテーブルのidが1の田中さんのみを取得したい場合は、以下のようなSQLになります。

SELECT * FROM users WHERE id = 1 AND name LIKE '田中%';

結果

+----+--------------+---------------------+---------------------+
| id | name         | created             | modified            |
+----+--------------+---------------------+---------------------+
|  1 | 田中太郎     | 2019-02-01 00:00:00 | 2019-02-12 00:00:00 |
+----+--------------+---------------------+---------------------+

田中デイヴィッド義徳 という名前の人がusersテーブルに登録されている場合、以下のSQLで検索可能です。

SELECT * FROM users WHERE name LIKE '%デイヴィッド%';

練習問題

  1. usersテーブルのidが2のユーザを取得しましょう。
  2. usersテーブルのnameが 安川小太郎 のユーザを取得しましょう。
  3. postsテーブルのcommentsに が含まれるデータを取得しましょう。

解答

1. usersテーブルのidが2のユーザを取得しましょう。

SELECT * FROM users WHERE id = 2;

2. usersテーブルのnameが 安川小太郎 のユーザを取得しましょう。

SELECT * FROM users WHERE name LIKE '安川小太郎';

3. postsテーブルのcommentsに が含まれるデータを取得しましょう。

SELECT * FROM posts WHERE comments LIKE '%は%';

会社の勉強会はここで講義が終え、本番DBをいじる問題を出題しました。

最後に

僕の社内では好評でした!
記事はこれで終わりではないですが皆さんの会社でもチャレンジしてみてくださいね!

vol.2へ続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

私は分析官。MySQLが嫌い。

三連休最終日。
休日出勤をして、ちょっとした集計をしようと思っただけなのに。
MySQLを通じて嫌な思いをしたので、書きなぐる、、、

何をしたかったか

Userの[年齢]情報の統計を確認したかった。
※ 実際には年齢の集計ではないが、安全のために

正規分布しておらず、むしろロングテールなのが今回のデータの特徴で、
代表値として平均を使うのは危険で、中央値を集計したかった。

準備

とりあえずこんな感じで一時テーブルを作った。
年齢が例だと冗長だけど、実際には重い処理だったので、必要だった。

drop temporary table if exists user_age
;
create temporary table user_age
select
    user_id
    , age
from
    user
;

平均、合計、カウント

かんたんである

select
  avg(age) average
  , count(distinct user_id) count
  , sum(age) sum 
from user_age
;

中央値の集計でイラッとした

本件データは100万レコードをゆうに超えており、Excelにうつしてmedian()するわけにもいかない。
そもそも、SQLの世界から飛び出てしまうのは、分析の再現性や、ポータビリティの観点から好ましくない。
というわけで、今回はいやいやMySQL内での完結を試みたのである。

イラッと①:MySQLにはmedian()がない。

medianを出すには、わざわざこんな書き方をしないといけない

select avg(distinct age) median
from(
  select t1.age
  from
    user_age t1
    , user_age t2  
  group by t1.age
  having
    sum(case when t2.age>= t1.age then 1 else 0 end) >= count(*) / 2 
    and sum(case when t2.age <= t1.age then 1 else 0 end) >= count(*) / 2 
  )tmp
;

可読性が終わっている。
どんな操作をしているか、全く読者に伝わらない。
どういうふうにコメントすればいいのだろうか。解説サイトのURLでも貼るか。

イラッと②:一時テーブルを複数回参照できない

上記コードは動かない。mysql can't reopen tableって怒られた。
いやいやいや、なんでダメなの、、、
したがって、先のコードに、

drop temporary table if exists ua_copy
;
create temporary table ua_copy
select * from user_age
;

というおまけがつき最終的な出来上がりは、

drop temporary table if exists ua_copy
;
create temporary table ua_copy
select * from user_age
;
select avg(distinct age) median
from(
  select t1.age
  from
    user_age t1
    , ua_copy t2  
  group by t1.age
  having
    sum(case when t2.age>= t1.age then 1 else 0 end) >= count(*) / 2 
    and sum(case when t2.age <= t1.age then 1 else 0 end) >= count(*) / 2 
  )tmp
;

イラッと③:遅い

なお、この記事書いてずいぶん時間がたつが、まだ実行が終わっていない。
もちろん、数百万行のcross joinをしているのが悪いわけだが、それにしてもしかしひどい。
100万行以下だったら、SQLでmedian求めずに、Excelでmedian()できたのに…
言い換えると、実質MySQLでmedianは求めるのは常に筋悪である、というのが所感である。

最後に

MySQL以外の環境に詳しくはない。
もしかしたらPostgreSQLでも同じこと起きるのかもしれない。
MySQLの名指しで叩くのはアンフェアかもしれない。

分析専業でもないので、何か知識不足で拙いことをしているのかもしれない。
しかし、数百人規模のIT企業の非エンジニアで1,2のSQLスキルを持っている。

私はデータ分析文化を育むには、一定数、ビジネス職がSQLを叩く必要があると思っている。
データ分析に興味を持ってくれた人が、こんなmedian一つで、躓いてほしくない。

技術選定にあたっては、そういった、データ分析環境のことも考えてもらえると嬉しい。
もしくは、積極的にBigQueryなどモダンな環境にレプリしてくれると嬉しい。
SASなどを入れるとUIの力で解決するのかもしれないが、どうなのだろうか。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker for Macで開発環境(DBとWEBサーバ)を用意した記録

PCの中を汚したくなかったのでDockerからいれてみた

  • Docker for Macを下記URLからDLとインストール

  • DB:mysql,WEBサーバ:nginxのイメージをpullコマンドでダウンロード

    • バージョンの指定もできるが今は最新版をダウンロードする
    • imagesコマンドでダウンロードしたイメージの一覧が確認できる
コンソール
$ docker pull mysql
$ docker pull centos
$ docker images
  • DB:mysqlの用意
    • コンテナ名:mysql
    • mysqlのrootパスワード: password
    • 最後にコンテナの中に入って起動しているか確かめる
    • コンテナの中から出たい時はexitコマンドで出れる
    • -pオプションで転送元:転送先のポートフォワーディングができる
    • 新しいmysqlだと安易なアクセスを許さないようなので--default-authentication-plugin=mysql_native_passwordオプションを追加(詳細はよく把握していない)
コンソール
$ docker run -it --name mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql --default-authentication-plugin=mysql_native_password
$ docker exec -it mysql bash
  • WEBサーバ:nginxの用意
    • コンテナ名: mycentos
    • 最後にコンテナの中に入って起動しているか確かめる
コンソール
$ docker run -it --name mycentos -d centos
$ docker exec -it mycentos bash
centosの中
$ yum install yum-utils
$ vi /etc/yum.repos.d/nginx.repo
$ yum-config-manager --enable nginx-mainline
$ yum install nginx
  • /etc/yum.repos.d/nginx.repoでは新規作成して下記をコピペし保存
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
  • mysqlクライアントも入れておく
centosの中
$ yum install -y mysql
  • WEBサーバのコンテナのイメージ化とアップロード
    • docker psコマンドでCONTAINER IDを確認する
    • コンテナををcommitコマンドによりイメージ化
    • $ docker psコマンドでイメージ化できているか確認
    • Docker Hubにpushコマンドをしてアップロード
    • 1.0とか付けてるけどおそらく任意の数でいいと思う
コンソール
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
f760e6313d6b        centos              "/bin/bash"              23 minutes ago      Up 23 minutes                             mycentos
ed21f55a3fe4        mysql               "docker-entrypoint.s…"   25 minutes ago      Up 25 minutes       3306/tcp, 33060/tcp   mysql
コンソール
$ docker commit f760e6313d6b {user名}/centos:1.0
$ docker login
$ docker push {user名}/centos:1.0
  • webサーバを立ち上げる
    • testappに入ってmysqlに接続できるかテスト
    • 接続後mysqlへの疎通も確認
コンソール
$ docker run -it --name testapp --link mysql:mysql -d -p 8080:80 {user名}/centos:1.0
$ docker exec -it testapp bash
  • 以下のように入れるはず
testappの中
$ mysql -u root -p -h $MYSQL_PORT_3306_TCP_ADDR
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.15 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> 
  • nginxを起動してwelcomeページが表示されるかテスト
    • (上記のmysqlからexitで出た後の想定)
    • 下記コマンドを入力後 http://localhost:8080 にアクセスしてWelcome to nginx!と出ればOK
$ nginx
  • 以上で最低限の環境はできた

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL8.0のZIP版をWindows10にインストールする

インストーラー版を使わない理由

必要に応じてバージョンの切り替えが必要になるものは、インストーラーを使うと、別のバージョンを使いたい時にどうしたらいいのかが分からなくなることや、使わない時も自動起動されてしまいます。

自分が使う時に目的とするバージョンを立ち上げればいいので、ZIPファイルを展開してMySQL8.0 を使える状態にします。

やること

  1. ZIPアーカイブ版のダウンロードと展開
  2. my.cnf を作成
  3. MySQLの初期化
  4. rootパスワードの変更
  5. タイムゾーンの設定
  6. databaseと専用ユーザを作成

TL;DR

  • mysqld --initialize で生成されるrootパスワードは mysqld.err にある。
  • タイムゾーンは+9:00 でもok。
  • grant all privilegesは使えないから、create usergrantを使う。

1. ZIPアーカイブ版のダウンロードと展開

MySQLのダウンロードページOther Downloads にある Windows (x86, 64-bit), ZIP Archive をダウンロードします。

MySQL80-zip-download.png

今回は、mysql-8.0.15-winx64.zip をダウンロードしました。ダウンロードした mysql-8.0.15-winx64.zip を任意のディレクトリへ展開します。今回は d:\my-work\mysql-8.0.15-winx64 に展開しました。

2. my.cnf を作成

展開したディレクトリ直下に my.cnf を作成します。フルパスで表記すると d:\my-work\mysql-8.0.15-winx64\my.cnf になります。

多くの設定項目があるのですが、必要なだけを設定します。

my.cnf
[mysqld]
default-time-zone='+9:00'

default_authentication_plugin=mysql_native_password

character-set-server = utf8mb4
collation-server = utf8mb4_ja_0900_as_cs
init-connect = SET NAMES utf8mb4

# dirs
basedir=d:/my-work/mysql-8.0.15-winx64
datadir=d:/my-work/mysql-8.0.15-winx64/data
tmpdir =d:/my-work/mysql-8.0.15-winx64/temp
pid-file=d:/my-work/mysql-8.0.15-winx64/mysqld.pid

3. MySQLの初期化

my.cnfdatadirtempdir で指定したディレクトリを作成した後に bin\mysqld --initialize を実行します。

cmd> cd /d d:\my-work\mysql-8.0.15-winx64
cmd> mkdir data
cmd> mkdir temp
cmd> bin\mysqld --initialize

バージョンが5.7の頃よりは時間が長く感じ(個人差があります)、dataディレクトリ配下にモリモリとファイルが作成されていきます。

プロンプトが返ってきたら、MySQLのサーバを起動します。

cmd> bin\mysqld  --standalone  --console 

4. rootパスワードの変更

bin\mysqld --initialize で生成されたパスワードを確認

DBの初期化時に --initialize-insecure オプションを使わずに、--initialize オプションを使ったので、rootユーザにはランダムなパスワードが設定されています。そのままでは使い難いので、別のパスワードを設定します。

ランダムなパスワードは data\mysqld.err に出力されています。

2019-02-11T00:16:51.201908Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: [ここがパスワード]

rootのパスワードを変更

新しいコマンドプロンプトを立ち上げて alter userでパスワードを変更します。

cmd> cd /d d:\my-work\mysql-8.0.15-winx64
cmd> bin\mysql -u root -p -h localhost
Enter password: [data/mysqld.errに記録されているパスワードを入力]
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.15

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> alter user root@'localhost' identified by '[新しパスワード]';

5. タイムゾーンの設定

my.cnfにタイムゾーンを指定するときに default-time-zone='Asia/Tokyo' と記載する記事を見かけます。Windows版のZIP版では mysql.time_XXXX テーブルが空です。
公式ドキュメントのMySQL Server Time Zone Supportに従ってタイムゾーンのデータを投入します。

https://dev.mysql.com/downloads/timezones.html から timezone_2018i_posix_sql.zip をダウンロードして、任意のディレクトリに展開します。展開すると、timezone_posix.sql があります。

MySQL8-timezone-download.png

rootユーザでMySQLに接続して、 mysqlデータベースを選択して、 timezone_posix.sql に記載されたスクリプトを実行します。

cmd> bin\mysql -u root -p -h localhost 
mysql> use mysql
mysql> \. path/to/timezone_posix.sql

スクリプトの実行が終了したら、 my.cnfのtimezoneを Asia/Tokyo に変更します。その後、MySQLを再起動してください。

my.cnf
default-time-zone='Asia/Tokyo'

タイムゾーンは日本だけで使っているのであれば+9:00 でもいいと思うけど、一時期にサマータイムが騒がれた時に +9:00 に固定すると夏時間に対応できないのと、unix系のプラットフォームとそろえるために、Asia/Tokyo にしました。

6.databaseと専用ユーザを作成

create databaseは今まで通りです。 MySQL5.xまでは grant で権限付与とパスワード設定を行えましたが、MySQL8からロールができたことで、ユーザ作成と権限付与を別々に行います。
詳しくは mysql8 grant all privileges でググってください。

cmd> bin\mysql -u root -p -h localhost 
mysql> create database my_db;
mysql> create user 'my_db_user'@'localhost' identified by 'secret'; 
mysql> grant all privileges on my_db.* to 'my_db_user'@'localhost';

バッチファイル

インストーラーを使わないのでバッチファイルを作っておきます。

MySQLを起動する

mysql_start.bat
d:\my-work\mysql-8.0.15-winx64\bin\mysqld  --standalone  --console 

エクスプローラーか mysql_start.batをダブルクリックして、MySQLを起動します。起動した後はコマンドのウィンドウが残り続けます。終了するときは、コマンドのウィンドウで ctrl+cを入力してください。

MySQLにパスを通して、コマンドプロンプトからMyQLのコマンドを利用できる

mysql_cmd.bat
set PATH=d:\my-work\mysql-8.0.15-winx64\bin;%PATH%
start

MySQLにパスが通った状態でコマンドプロンプトが起動するので、MySQLの任意のコマンドを実行できます。

メモ: --initialize-insecure を使わなかった理由

--initialize-insecure を使わなかったのは、rootユーザのパスワードを空にすると、そのまま使い続けてしまうので、それはよくないなか~と思ったのと、パスワードを設定するためには、--skip-grant-tables を指定して再起動する必要があります。

それなら、--initialize を使うのがよいかなと思いました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLでUTF-8に/etc/my.cnfがない

MySQLで文字コードをUTF-8にする

・MySQL 5.7

MySQLの文字コードをUTF-8にしたいとき求めていたファイルがなかったことがあったので
忘れないようにメモ程度に残しておきます。
他の方の助けになれば嬉しいです。

UTF-8にする

/etc/my.cnf
がなかった時は

/etc/mysql/my.cnf
を編集しましょう。

/etc/mysq/my.cnf
[mysqld]
character-set-server=utf8 

[client]
default-character-set=utf8 

上記の文字を追加してください。

再起動
/etc/init.d/mysqld restart

確認する

MySQLに入ってお馴染みの確認コマンドを打ちます。

show variables like "chara%";

UTF-8になっていたら完了です。
お疲れ様でした。

参考

https://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a


閲覧していただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む