20210415のMySQLに関する記事は5件です。

SpringBoot + MyBatis + Thymeleaf + MySQL で超簡潔なCRUD処理

以前に投稿させていただいた記事の続き的なものです。 CRUD処理全て実装できたので、自分用のアウトプットとして投稿させていただきます。 記載が稚拙だったり誤っている箇所等あるかもしれませんがご容赦ください。 誤りについてはご指摘いただけますと大変幸いですm(_ _)m。 環境 Spring Boot 2.4.4 Java 11 OS  : macOS Big Sur IDE : SpringToolSuite4 Maven 目標 SQLでテーブルusers(カラムはid, name, age)を作成し、以下の4つの処理ができるアプリを作成。 新規ユーザー登録(C) ユーザー情報表示(R) ユーザー情報更新(U) ユーザー情報削除(D) ディレクトリ構成 . ├src/main/java/com/example/demo/ │                 ├controller / UController.java │                 ├model / User.java │                 ├repository / UMapper.java │                 ├service / UService.java │                 └MyBatisPracticeApplication.java └ src/main/resources/          ├mapper / UMapper.xml          ├templates / users          │         ├change.html          │         ├details.html          │         ├list.html          │         ├register.html          │         └top.html          ├application.properties          ├data.sql          └schema.sql 各ソースコード application.properties spring.datasource.url=jdbc:mysql://localhost:3306/[任意のDB名を記載してください]?serverTimezone=Asia/Tokyo spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=root spring.datasource.password=[MySQLのパスワードを記載してください] spring.datasource.sql-script-encoding=UTF-8 spring.datasource.initialization-mode=always spring.datasource.schema=classpath:schema.sql spring.datasource.data=classpath:data.sql #MyBatis mybatis.mapper-locations=classpath*:/mapper/*.xml #Log Level logging.level.com.example=debug MySQLの利用に必要な記載と、アプリ実行時に実行するSQLファイルの記載です。 #MyBatis…読み込むxmlファイルの場所を記載してください。 #LogLevel…コンソールにSQLの処理を出力してくれます(無くてもOKです)。 schema.sql CREATE TABLE IF NOT EXISTS users ( id VARCHAR(50) PRIMARY KEY, name VARCHAR(50), age INT ); 作成するテーブルの内容を記載します。 data.sql INSERT IGNORE INTO users (id, name, age) values ('1', 'Tom', 30), ('2', 'Mike', 31); usersテーブルに予めINSERTしておくユーザー情報を記載します。 list.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"></meta> <title>ユーザーList</title> </head> <body> <table border=1> <tr> <th>ID</th> <th>名前</th> <th>年齢</th> </tr> <tr th:each="u:${users}"> <td th:text="${u.id}"></td> <td th:text="${u.name}"></td> <td th:text="${u.age}"></td> </tr> </table> </body> </html> http://localhost:8080/users/list で全ユーザー情報を表示する画面です。 私が初めに作成したselect全件処理時のファイルを残しているだけですので、無くても大丈夫です。 top.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ユーザー一覧</title> </head> <body> <h1>ユーザー一覧(top.html)</h1> <div th:if="!${users.size()}"> <p>登録されているユーザーはいません</p> </div> <a th:href="@{/users/register}"><!-- URL「/users/register」生成 --> <button>新しいユーザーを登録</button> </a> <table th:if="${users.size()}" border=1> <!-- DB内のデータがtrue = 0以外の時 --> <thead> <tr> <th>ID(PRIMARY KEY)</th> <th>名前</th> <th>年齢</th> <th></th> <th></th> <th></th> </tr> </thead> <tbody> <tr th:each="users:${users}" th:object="${users}"> <td th:text="*{id}"></td> <td th:text="*{name}"></td> <td th:text="*{age}"></td> <td><a th:href="@{/users/details/id={id}(id=*{id})}"><button>詳細</button></a></td> <td><a th:href="@{/users/change/id={id}(id=*{id})}"><button>変更</button></a></td> <td> <form th:method="post" th:action="@{/users/delete/id={id}(id=*{id})}"><button>削除</button></a> </form></td> </tr> </tbody> </table> </body> http://localhost:8080/users で表示されるトップページです。 全ユーザー情報を表示し、各ボタンの機能は以下の通りです。 [新しいユーザーを登録]ボタン→register.htmlへ遷移 [詳細]ボタン→details.htmlへ遷移 [変更]ボタン→change.htmlへ遷移 [削除]ボタン→当該ユーザー情報を削除 details.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ユーザー詳細</title> </head> <body> <h2>ユーザー詳細表示(details.html)</h2> <div th:object="${users}"> <table border="1"> <tr> <th>ID</th> <th>名前</th> <th>年齢</th> </tr> <tr> <td th:text="*{id}"></td> <td th:text="*{name}"></td> <td th:text="*{age}"></td> </tr> </body> </html> register.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>新規ユーザー登録</title> </head> <body> <h2>新規ユーザー登録(register.html)</h2> <form th:method="post" th:object="${users}" th:action="@{/users/register}"> <label>ID(VARCHAR):<input type="text" th:field="*{id}"></label><br> <label>名前(VARCHAR):<input type="text" th:field="*{name}"></label><br> <label>年齢(INT):<input type="text" th:field="*{age}"></label><br> <button>新規作成</button> </form> </body> 当初はth:fieldの部分を単なるname属性で記載していてそれでも動いたのですが、th:fieldで動かして見たくて書き換えました。 その時以下のエラーが出て悩んでおりました。 java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name ‘users’ available as request attribute その後th:objectについて調べ、ControllerクラスにModelの記載を追加して解決しました。 (参考にさせていただいたteratailの質問:https://teratail.com/questions/26218) change.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ユーザー変更</title> </head> <body> <h2>ユーザー変更(change.html)</h2> <form th:method="post" th:object="${users}" th:action="@{/users/change/id={id}(id=*{id})}"> <label>ID(VARCHAR):<input type="text" th:field="*{id}"></label><br> <label>名前(VARCHAR):<input type="text" th:field="*{name}"></label><br> <label>年齢(INT):<input type="text" th:field="*{age}"></label><br> <button>変更</button> </form> </body> </html> User.java package com.example.demo.model; import lombok.Data; @Data public class User { private String id; private String name; private int age; } エンティティクラスです。 UMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.repository.UMapper"> <resultMap type="com.example.demo.model.User" id="user"><!-- id属性は任意の値 --> <!-- columnはSQLのカラム propertyはエンティティクラスのフィールド --> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> </resultMap> <select id="findOne" resultMap="user"> select * from users where id = #{id} </select> <select id="find" resultType="com.example.demo.model.User"> select * from users </select> <insert id="insertOne"> insert into users ( id, name, age ) values ( #{id}, #{name}, #{age} ) </insert> <update id="updateOne"> update users set name = #{name}, age = #{age} where id = #{id} </update> <delete id="deleteOne"> delete from users where id = #{id} </delete> </mapper> UMapper.java package com.example.demo.repository; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import com.example.demo.model.User; @Mapper public interface UMapper { //select1件 public User findOne(String id); //select全件 public List<User> find(); //insert public void insertOne(User u); //update public void updateOne(@Param("id") String id, @Param("name") String name, @Param("age") int age); //delete public void deleteOne(User u); } UService.java package com.example.demo.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.demo.model.User; import com.example.demo.repository.UMapper; @Service public class UService { @Autowired UMapper mapper; //select1件 public User getUserOne(String id) { return mapper.findOne(id); } //select全件 public List<User> getList() { return mapper.find(); } //insert public void insertOne(User u) { mapper.insertOne(u); } //update public void updateOne(String id, String name, int age) { mapper.updateOne(id, name, age); } //delete public void deleteOne(User u) { mapper.deleteOne(u); } } UController.java package com.example.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import com.example.demo.model.User; import com.example.demo.service.UService; import java.util.List; @Controller @RequestMapping("/users") public class UController { @Autowired private UService service; //select全件表示 @GetMapping("/list") public String getUserList(Model model) { List<User> userList = service.getList(); model.addAttribute("users", userList); return "users/list"; } //トップページ top.html表示 @GetMapping("") public String top(Model model, @ModelAttribute User u) { model.addAttribute("users", service.getList()) ; return "users/top"; } //top→[詳細]押下 select1件 @GetMapping("details/id={id}") public String details(@PathVariable("id") String id, Model model) { model.addAttribute("users", service.getUserOne(id)); return "users/details"; } //top→[新規作成]押下 th:hrefにより生成されたURLをGETで表示 @GetMapping("/register") public String registerUser(Model model, @ModelAttribute User u) { model.addAttribute("users", u); return "users/register"; } //register.html内の <form method="post"> で↓へ飛ぶ @PostMapping("/register") public String create(@Validated @ModelAttribute User u, BindingResult result) { if (result.hasErrors()) { return "users/register"; } service.insertOne(u); return "redirect:/users"; } //top→[変更]押下時にchange.htmlを表示するGET @GetMapping("change/id={id}") public String change(@PathVariable("id") String id, Model model) { model.addAttribute("users", service.getUserOne(id)); return "users/change"; } @PostMapping("change/id={id}") public String update(@ModelAttribute User u, Model model) { service.updateOne(u.getId(), u.getName(), u.getAge()); return "redirect:/users"; } //top→[削除]押下時 @PostMapping("delete/id={id}") public String delete(@PathVariable String id, @ModelAttribute User u) { service.deleteOne(u); return "redirect:/users"; } } あとはブラウザに( http://www.localhost:8080/hello/users ) と入力すればtopページが表示されるはずです。 お疲れ様でした! 参考にさせていただいたQiita記事 前回から引き続き、下記記事を参考にさせていただきました。 ありがとうございました! https://qiita.com/sumichan/items/bdc2a0e909416ae55162
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP ハッシュ関数

はじめに ・PHPで、セキュリティに関心がある方 ・ハッシュ、ハッシュ関数が分からない方 ハッシュとは ハッシュとはアルゴリズムに基づき、読解不可能な文字列などに置換する仕組みのことです。 ※パスワードなどの機密情報を扱う時になどに使用します。 代表的なハッシュ関数 PHPには標準で、文字列からハッシュ値を計算し、生成する関数が存在します。 ※以下が代表的な、ハッシュ関数です。 ハッシュ関数 詳細 hash 指定したアルゴリズムで、ハッシュ値を生成する ※バージョン 5.1.2以降 md5 MD5方式で、16進数・32文字のハッシュ値を生成する sha1 SHA-1方式で、16進数・40文字のハッシュ値を生成する password_hash 機密性の高い文字列のハッシュ値を生成する ※バージョン 5.5以降 hash sample_hash.php <?php $str = 'hoge'; var_dump(hash("sha256", $str)); ?> 実行結果 string(64) "ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825" md5 sample_md5.php <?php $str = 'hoge'; var_dump(md5($str)); ?> 実行結果 string(32) "a577f0035386e7d04551e867b3d9f024" sha1 sample_sha1.php <?php $str = 'hoge'; var_dump(sha1($str)); ?> 実行結果 string(40) "31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c" password_hash sample_password_hash.php <?php // ハッシュ値を計算する前の文字列 $str = "hoge"; // ハッシュ値を計算 password_hash($str, PASSWORD_DEFAULT); ?> 実行結果 string(60) "$2y$10$zgsW6rm.9wcBnkSw2/Jp3OiJSDy5gsEUAM6fum4zva7/5jauNVixK" おまけプログラム IDとパスワードを入力し、DBに保存するプログラムを作成しました。なお、パスワードはpassword_hashを使用し、ハッシュ化しています。 ※今回使用するDB情報 ユーザー名 DB名 カラム名情報① カラム名情報② id_pass_user hashdb id_data varchar(100) pass_data varchar(100) 新規で作成した、ユーザーにはパーミッション(権限)がないので、以下のコマンドで付与します。今回の場合は、id_pass_userにDBレベル(hashdb)での付与になります。 パーミッションの付与(DBレベル) mysql> grant all on hashdb.*to id_pass_user@localhost; ※入力する、IDとパスワード ID パスワード hogeID hogePASS コード一覧 data_vaildataion.php <?php // ID,パスワードと、DBのバリデーションの補助を実装したクラス class DataVaildataion { //ID,パスワードと、DBのバリデーションに必要なデータをカプセル化 private $hash_pass = null; private $success_message = null; private $error_message = null; private $clean = array(); # ゲッターは今回必要ないので、コメントアウト /*public function getHashPass() { return $this->hash_pass; } public function getSuccessMessage() { return $this->success_message; } public function getErrorMessage() { return $this->error_message; } public function getClean() { return $this->clean; }*/ // セッターで、ID,パスワードのバリデーションの補助 public function setHashPass($hash_pass) { return $this->hash_pass = $hash_pass; } public function setSuccessMessage($success_message) { return $this->success_message = $success_message; } public function setErrorMessage($error_message) { return $this->error_message = $error_message; } public function setClean($clean) { return $this->clean = $clean; } } ?> db.php <?php // 必要なプロパティのあるクラスファイルの呼び出しと、インスタスの生成 require_once('data_vaildataion.php'); require_once('from.php'); $data = new DataVaildataion(); // データベースの接続情報を定数で実装 define( 'DB_HOST', '127.0.0.1'); # phpadminの場合は、localhost define( 'DB_USER', 'id_data_user'); define( 'DB_PASS', '各自のパスワード'); define( 'DB_NAME', 'hashdb'); // Dataクラスのセッターを使用し、ID,パスワードのバリデーションを実装 if(!empty($_POST['btn_submit'])) { if(empty($_POST['id_data']) || empty($_POST['pass_data'])) { echo $data->setErrorMessage('IDまたは、パスワードが未入力です。').PHP_EOL; exit(); }else { // Dataクラスのセッターを使用し、IDのサニタイズの実装 (シングルクフォートと、ダブルクフォートをHTMLに変換しない) $data->setClean($clean['id_data'] = htmlspecialchars( $_POST['id_data'], ENT_QUOTES)); // 上記と同じく、パスワードのサニタイズの実装 $data->setClean($clean['pass_data'] = htmlspecialchars($_POST['pass_data'], ENT_QUOTES)); // セキリュティを考慮し、password_hashを採用(同じハッシュを生成しない。DBとの比較の際は、password_verifyを採用) $data->setHashPass($hash_pass['hash_pass'] = password_hash($clean['pass_data'], PASSWORD_DEFAULT)); } // Dataクラスのセッターを使用し、DBのバリデーションを実装後、DBに保存 if(empty($data->setErrorMessage($error_message)) ) { $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME); if($mysqli->connect_errno ) { echo $data->setErrorMessage('エラー番号 '.$mysqli->connect_errno).PHP_EOL; exit(); }else{ $sql = "INSERT INTO hash (id_data, pass_data) VALUES ( '$data->setClean($clean[id_data])', '$data->setClean($hash_pass[hash_pass])')"; } $res = $mysqli->query($sql); if($res) { echo $data->setSuccessMessage('登録が完了しました。'); }else{ echo $data->setErrorMessage('登録に失敗しました。'); } $mysqli->close(); } } ?> from.php <?php require_once('data_vaildataion.php'); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>ハッシュ化しよう</title> </head> <body> <h1>新規登録画面</h1> <div class="input_area"> <form action="db.php" method="post"> <dl class="id"> <dt>ID</dt> <dd><input type="text" name="id_data"></dd> </dl> <dl class="pass"> <dt>PASS</dt> <dd><input type="text" name="pass_data"></dd> </dl> <input type="submit" name="btn_submit" value="新規登録"> </form> </div> </body> </html> hashdb +----+---------+----------------------------------------------------------------+ | id | id_data | pass_data | +----+---------+----------------------------------------------------------------+ | 1 | (hogeID) | ($2y$10$0V2iu9qPDLJ/LOo629jT2OSNWlEHqUzADek23k.Ns.swWZiT3GRxu) | +----+---------+----------------------------------------------------------------+ ※上記のコードで、IDとハッシュ化されたパスワードがDBに保存できます。 参考サイト ・文字列からハッシュ値を取得する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Django の QuerySet で group by をする方法

Introduction 現在、 Twitter Developer API を使ってシンプルなTwitter分析アプリ を作成中です。それで、定期実行でリクエストをかけたものをMySQLにてデータをストックしていました。 あるとき、 いいね(favorite)が多く押されたツイートを探す ことをしようとしました。 もし、MySQLで取得する場合は、下記の通りツイートIDでgroupbyをしてその中でいいね数が一番大きいものを取得する記述をすればいいのですが、 DjangoにはSQLを書かずにコード上で取得できるQuerySetというものがあるので、なるべく使おうと思ったとです。 select tweet_id, max(favorite_count) as fav_max from ONE_WEEK_TWEET group by tweet_id order by fav_max desc limit 10 Dataset データセットですが、 Twitter Development API の [GET]search/tweets にてレスポンスされた値を使っています。 この後で、MySQLのテーブルにほぼそのままデータを残しています。 テーブル構成はこんな感じ CREATE TABLE `ONE_WEEK_TWEET` ( `id` int NOT NULL AUTO_INCREMENT, `tweet_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `query` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `text` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `media` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `user_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `user_screen_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `retweet_count` int DEFAULT NULL, `favorite_count` int DEFAULT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_ONE_WEEK_TWEET_timestamp` (`timestamp`), KEY `idx_ONE_WEEK_TWEET_query` (`query`), KEY `idx_ONE_WEEK_TWEET_tweet_id` (`tweet_id`), KEY `idx_ONE_WEEK_TWEET_favorite_count` (`favorite_count`) ) ENGINE=InnoDB AUTO_INCREMENT=128216863 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci それで、APIによる取得は15分間隔で取得しているので、tweet_idが重複したかたちで随時取り込まれます。例として、ユーザに数時間トレンドとして注目されるツイートあったとして、時間を追うごとにリツイート数やいいね数がプラスされ、tweet_idのタイムログとしてデータが残ることになります。 id tweet_id user_screen_name favorite_count created_at 127925165 1381948770779205633 shingeki__kun 146282 "2021-04-14 23:07:26" 127919064 1381948770779205633 shingeki__kun 144569 "2021-04-14 22:49:54" 127910044 1381948770779205633 shingeki__kun 141736 "2021-04-14 22:21:01" 127907040 1381948770779205633 shingeki__kun 140661 "2021-04-14 22:10:28" 127901833 1381948770779205633 shingeki__kun 138909 "2021-04-14 21:54:04" 127893406 1381948770779205633 shingeki__kun 136266 "2021-04-14 21:32:43" 127442169 1381948770779205633 shingeki__kun 311 "2021-04-13 21:49:43" 127438233 1381948770779205633 shingeki__kun 61 "2021-04-13 21:37:28" ここでの目的ですが、各ツイートでいいね数が一番多い値を取得する、ということです。 上記をふまえて、QuerySetを使ってのgroupbyの方法を書いてみます。 Method 前置きなしにコードを書いてみます。 from django.db.models import Max ONE_WEEK_TWEET.objects.values("tweet_id").annotate(fav_max=Max('favorite_count')).order_by('fav_max').reverse().values(*["tweet_id", "fav_max"]) 一般化すると、、、 ONE_WEEK_TWEET.objects.values("[groupbyで集合をかけるカラム]").annotate(fav_max=Max('[集合した中での最大値をとりたいカラム]')) となります。 あとはツイートで最大のいいね数がfav_maxカラムで管理されるので、order_by('fav_max').reverse()で降順し、必要なカラムをvalues(*["tweet_id", "fav_max"]) すれば完了
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mysql2::Error: Specified key was too long; max key length is 767 bytesに遭遇した

 私がやった対処等 ①config/database.ymlのencoding:utf8mb4部分の修正 utf8mb4⇨utf8に変更 ②(私はこの段階で既にrails db:createしていたためでまだ組み始めたばかりだったため)一旦、rails db:dropでデータベース消去 ③ $ rails db:create $ rails db:migrate の順で復旧
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【SQL】MySQLをインストールする (Windows) no.5

こんにちは、まゆみです。 SQLについての記事をシリーズで書いています。 前回、前々回の記事では、SQLの練習をするのに、SQL Online IDEを使ってきました。 今回の記事では、MySQLのインストールの仕方を書いていこうと思います。 少し複雑なプロセスですが、スクショも付けて書いていきますので、順番通りにすれば無事にインストールできると思います ではさっそく始めていきますね。 MySQLのインストール 下記の2つをインストールします MySQL Workbench (MySQLをGUIで操作できるアプリ) MySQL Server   MySQLのサイトにアクセスする。 こちらからMySQLのサイトにアクセスしてください。 『DOWNLOAD』をクリック 『MySQL Community』をクリック 『MySQL installer for Windows』をクリック 選択肢が2つ示されますが、上の方の『Download』をクリック 『No, thanks. just start my download.』をクリック installer を開く 『Custom』を選択して『Next』をクリック Applications > MySQL Workbench > MySQL Workbench バージョン とクリックしてください。 すると緑の➡が出ますので、それをクリック 同様にして、『MySQL Server』も選択して、緑のやじるしをクリックします Server と Workbenchが 『Product To Be Installed』の方に移れば『Next』をクリックします あなたの使っているオペレーティングシステムによっては下記のようになるかも知れません。(古いバージョンのMicrosoft Visual C++がコンピュータに入っていると起こりうる) Requirementの欄に書かれているものをダウンロードしてください。 こちらからMicrosoft のsupportページにアクセスできますので、指定のファイルをダウンロードしてください。 MySQLのインストーラーに戻れば、プロセスの続きからできるはずです。 『Excute』をクリック Status が『Downloaded』になればOKです。 『Excute』をクリック Status がCompleteになればOKです 『Next』をクリックします オペレーティングシステムの違いがあるのでしょうが、このまま『Product Configuration』のページに進める人もいますが、私の場合は、インストーラーで『Reconfig』をクリックして、次のプロセスに進みました。 Type and Networking に進みましたら、そのまま『Next』をクリックしてください。 パスワードを決めます。 忘れると大変なので、どこかにメモっておいてくださいね。 『Next』をクリック 『Excute』をクリック 下記のようになればオッケーです。 まとめ MySQLのインストールは以上になります。 次回の記事では、インストールしたMySQLを使ってデータベースを作る方法を書いていきますね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む