- 投稿日:2019-02-11T20:37:40+09:00
PHPで入力フォームのデータをSELECT文のINSERTを使って、MySQLに書き込む
以下の2つソースコードを作ります。
①入力フォーム
②入力フォームで入力されたデータをPOSTで受け取って、DBに接続して書き込む<!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>
- 投稿日:2019-02-11T18:49:16+09:00
SQLをオンラインで試せるサービス
- 投稿日:2019-02-11T15:47:51+09:00
[SQL入門] 営業向けSQL勉強会やってみた vol.1
イントロ
営業戦略を立てる上で顧客データや行動を知るのは大事ですよね。僕の勤めている会社でも営業の方から〇〇のデータが欲しい、xxの現状を知りたいとお願いされることがあります。今回はそんな営業の方達が簡単なデータなら自分たちでいつでも調べられるように、社内で営業向けSQL勉強会を開いた際の手順を投稿させていただきます。
*僕が勤めている会社の社内勉強会は1回あたり1時間なので、複数回開催。この記事は第1回目の勉強会が終わった時点で投稿しています。
第1回目を終えた感想
ちょっと早いですが、最初に勉強会を開催してみての感想を書きます。
良かった点
- 内容を絞ったので営業の方たちにスムーズにすすめてもらえた。
- ハンズオン形式が好評で、自分でデータを取得できる快感に目覚めてもらえた。
- 後日、「こんなデータ取れませんかね?」と営業活動に活かせてもらえた。
3つ目のクエリは流石に僕が書きましたが、データに興味を持ってもらえたのは大きな進歩かなと思いました!
悪かった点
- PC操作に慣れていない点を十分考慮できなかった。
- 英語に不慣れであった点を考慮できなかった。
普段の仕事ではPC & 英語に慣れている人が大半なので、もうちょっと考慮すべきでした。
主にぶつかった点は、
① コピペで練習問題をすすめてしまった人がちらほら。(写経して体で覚えてほしかった)
② 半角、全角の区別。(主にスペースでエラーになってしまう人がちらほら)第2回目の勉強会では以上の点を反省して進めていきたいと思いました。
みなさんも自社で勉強会を開催する際は十分配慮してあげてください。
勉強会の進め方
以下の手順で勉強会を進めました。
- 簡単な構成のDB、本番DBを用意
- SQLの概要説明
- 簡単な構成のDBでselect文の講義
- 簡単な構成のDBを用いて練習問題
- 問題の解答、解説
- トピック(select, where, order, etc...)を変えて 3~5の繰り返し
- 本番DBを用いて、各トピックの問題を出題
- 問題の解答、解説
- 本番DBへはRead権限でアクセスできるように設定。
環境
MySQL 5.7.24
事前準備
営業の方が各自のPCでセットアップする必要がないように、僕の会社ではRe:dashでDBへアクセスできる環境を整えました。
第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つのテーブルは意味のあるデータの集合体となっています。
多くのシステムは複数のテーブルで構成されています。エクセルやスプレッドシートでは
表みたいなものです。レコード
テーブルの横1行のデータです。例えばusersテーブルというユーザの情報を保存するテーブルがあるとすると、usersテーブルの1レコードはユーザ1人のデータを表します。
エクセルやスプレッドシートでは
行みたいなものです。カラム
テーブルの縦1列のデータです。例えばusersテーブルの名前を保存するnameカラムは、すべてのユーザの氏名のデータを表します。
エクセルやスプレッドシートでは
列みたいなものです。データベース(DB)
意味のあるテーブルの集合体です。
また、SQLは大文字小文字の区別がありません。載せている解説はわかりやすいようにSQL固有の単語(命令)を大文字として表示しています。
練習環境
練習するデータベースとして以下の環境を用意しました。今回は第1回の講義なので、簡易的なテーブル構成を用意しました。
イメージとしては、写真もいいねもフォローもできないインスタグラムを思い浮かべてください。
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 | +----+-----------------+---------------------+---------------------+練習問題
- postsテーブルのすべてのカラムの値を取得しましょう。
- postsテーブルのcommentsカラムの値を取得しましょう。
- 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
ORDERは
ORDER 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 | +----+-----------------+---------------------+---------------------+練習問題
- postsテーブルのデータを更新日の新しい順で取得しましょう。
- usersテーブルのデータを更新日の古い順で取得しましょう。
- 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 '%デイヴィッド%';練習問題
- usersテーブルのidが2のユーザを取得しましょう。
- usersテーブルのnameが 安川小太郎 のユーザを取得しましょう。
- 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へ続く
- 投稿日:2019-02-11T15:02:30+09:00
私は分析官。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の力で解決するのかもしれないが、どうなのだろうか。
- 投稿日:2019-02-11T11:42:21+09:00
Docker for Macで開発環境(DBとWEBサーバ)を用意した記録
PCの中を汚したくなかったのでDockerからいれてみた
Docker for Macを下記URLからDLとインストール
- https://hub.docker.com/editions/community/docker-ce-desktop-mac
- インストールできたらコマンドラインで
docker
コマンドが使えるようになる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内でnginxを下記のnginx本家の言う通りに用意する
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
- 以上で最低限の環境はできた
参考
- 投稿日:2019-02-11T10:16:08+09:00
MySQL8.0のZIP版をWindows10にインストールする
インストーラー版を使わない理由
必要に応じてバージョンの切り替えが必要になるものは、インストーラーを使うと、別のバージョンを使いたい時にどうしたらいいのかが分からなくなることや、使わない時も自動起動されてしまいます。
自分が使う時に目的とするバージョンを立ち上げればいいので、ZIPファイルを展開してMySQL8.0 を使える状態にします。
やること
- ZIPアーカイブ版のダウンロードと展開
- my.cnf を作成
- MySQLの初期化
- rootパスワードの変更
- タイムゾーンの設定
- databaseと専用ユーザを作成
TL;DR
mysqld --initialize
で生成されるrootパスワードは mysqld.err にある。- タイムゾーンは
+9:00
でもok。grant all privileges
は使えないから、create user
とgrant
を使う。1. ZIPアーカイブ版のダウンロードと展開
MySQLのダウンロードページ の Other Downloads にある Windows (x86, 64-bit), ZIP Archive をダウンロードします。
今回は、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.pid3. MySQLの初期化
my.cnf
のdatadir
とtempdir
で指定したディレクトリを作成した後に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 --console4. 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
があります。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.cnfdefault-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.batd:\my-work\mysql-8.0.15-winx64\bin\mysqld --standalone --consoleエクスプローラーか
mysql_start.bat
をダブルクリックして、MySQLを起動します。起動した後はコマンドのウィンドウが残り続けます。終了するときは、コマンドのウィンドウでctrl+c
を入力してください。MySQLにパスを通して、コマンドプロンプトからMyQLのコマンドを利用できる
mysql_cmd.batset PATH=d:\my-work\mysql-8.0.15-winx64\bin;%PATH% startMySQLにパスが通った状態でコマンドプロンプトが起動するので、MySQLの任意のコマンドを実行できます。
メモ: --initialize-insecure を使わなかった理由
--initialize-insecure
を使わなかったのは、rootユーザのパスワードを空にすると、そのまま使い続けてしまうので、それはよくないなか~と思ったのと、パスワードを設定するためには、--skip-grant-tables
を指定して再起動する必要があります。それなら、
--initialize
を使うのがよいかなと思いました。
- 投稿日:2019-02-11T02:00:15+09:00
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
閲覧していただきありがとうございました。