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

mysql外部接続

mysql 外部接続

https://qiita.com/m-shin/items/770c1c54a889bf060751

select user, host, password from mysql.user;

GRANT ALL PRIVILEGES ON . TO aaa@"192.168.50.%" IDENTIFIED BY 'aaa' WITH GRANT OPTION;

MariaDB [(none)]> select user, host, password from mysql.user;
+-------------+--------------+-------------------------------------------+
| user | host | password |
+-------------+--------------+-------------------------------------------+
| root | localhost | |
| root | cent74 | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | cent74 | |
| aaa | localhost | *A02AA727CF2E8C5E6F07A382910C4028D65A053A |
| bbbbbbbbbbb | localhost | *C92Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| aaa | 192.168.% | *A02AA727CF2E8C5E6F07A382910C4028D65A053A |
| aaa | 192.168.50.% | *A02AA727CF2E8C5E6F07A382910C4028D65A053A |
+-------------+--------------+-------------------------------------------+

削除

DROP USER aaa@192.168.50.%;

ポート
MariaDB [(none)]> SHOW VARIABLES LIKE 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 3306 |
+---------------+-------+
1 row in set (0.001 sec)

接続確認

mysql -h 192.168.3.58 -u aaa --password=aaa

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

DBとLaravelの接続設定【備忘録】

はじめに

PHP/Laravelの勉強にて備忘録として

前提

MySQLがインストールされていること

LaravelのDB接続設定ファイル

config/database.php を開く

config/database.php
/*中略*/
    'default' => env('DB_CONNECTION', 'mysql'),
/*中略*/

となっている。

env('DB_CONNECTION', 'mysql')
上記のenvはDB_CONNECTIONが設定されていればDB_CONNECTION
設定されていなければMySQLを使用という意味である

ここでLaravelの環境変数を見てみる。

tinker(php artisan tinker)を起動し、 print_r($_ENV)を入力

$ php artisan tinker
$ print_r($_ENV)
    <中略>
    [APP_DEBUG] => true
    [APP_LOG_LEVEL] => debug
    [APP_URL] => http://localhost
    [DB_CONNECTION] => mysql
    [DB_HOST] => 127.0.0.1
    [DB_PORT] => 3306
    <中略>

DB_CONNECTIONはmysqlになっていることを確認。
ではLaravelの環境変数を決めているのは誰か。

プロジェクトトップにある.envファイルを開く

.env
<中略>
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
<中略>

これの DB_CONNECTION=mysql となっているところを使用したいDBに指定する。
今回はMySQLを使用するのでそのまま

config/database.php
        /*中略*/
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
        /*中略*/

config/database.php で自分が使用するmysql(今回は)の詳細設定をする

重要なのはdatabase, username, passwordで、すべenvなので.envで編集する

.env
<中略>
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
<中略>

今のままではDB名、ユーザ名、パスワードが上記のままなので変える。

.env
<中略>
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=
<中略>

上記のようにするとDB名がtest ユーザ名がrootでパスワード無しでログインする。

testデータベースを作成する
$ sudo service mysqld start
$ mysql -u root
mysql> CREATE DATABASE `test`;
データベースが接続されているか確認
$ php artisan tinker
>>> DB::connection();
=> Illuminate\Database\MySqlConnection {#2891} 
タイムゾーン設定

タイムゾーンの設定を「東京(Asia/Tokyo)」にする
レコード保存時に時間情報が設定したタイムゾーンの時間で保存される

config/app.php
    'timezone' => 'Asia/Tokyo',

以上

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

Laravel構築

Apacheインストール

# yum -y install httpd (yオプションは問い合わせに対して全て「y」で応答)

以下のコマンドで確認
# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18

起動確認

# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)

Active: inactive (dead) は停止

Apache起動

# systemctl start httpd

PHP インストール

  • PHP5.4

CentOS7の標準リポジトリのPHPバージョンが5.4
(古い...サポート切れてるやろ:grin:
PHP5.4以降をインストールする場合は、『PHP7.3』を参照(今回は7.3を例に)

# yum -y install php

以下のコマンド確認
# php -v
PHP 5.4.16 (cli) (built: Oct 30 2018 19:30:51) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
  • PHP7.3

EPELリポジトリをインストール

# yum -y install epel-release

REMIリポジトリをインストール(リポジトリの依存関係によりEPELリポジトリも同時にインストールされる)

# yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

PHP7.3をインストール

# yum -y install --enablerepo=remi,remi-php73 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql php-zip php-pecl-zip zip unzip git

以下のコマンドで確認
# php -v
PHP 7.3.11 (cli) (built: Oct 22 2019 08:11:04) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies

CentOS7からMariaDBが標準となっているため、
MySQLをインストールするためには削除する必要がある。

# yum remove mariadb-libs
# rm -rf /var/lib/mysql

MySQLのリポジトリをインストール

# yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm

MySQLインストール

# yum install -y mysql-community-server

以下のコマンドで確認
# mysqld --version
/usr/sbin/mysqld  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)

MySQLの状態を確認(デフォルトでは停止のはず)

# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html

Active: inactive (dead) は停止

MySQLを起動

# systemctl start mysqld

以下のコマンドで確認
# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-11-04 00:23:13 JST; 8s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 5342 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 5417 (mysqld)
   Status: "Server is operational"
   CGroup: /system.slice/mysqld.service
           └─5417 /usr/sbin/mysqld

Nov 04 00:22:59 localhost.localdomain systemd[1]: Starting MySQL Server...
Nov 04 00:23:13 localhost.localdomain systemd[1]: Started MySQL Server.

Active: active (running) で起動を確認

MySQLの自動起動設定を確認する(デフォルトは有効のはず)

# systemctl is-enabled mysqld
enabled

enable なので有効

変更は以下のコマンドで行う

無効にする
# systemctl disable mysqld
Removed symlink /etc/systemd/system/multi-user.target.wants/mysqld.service.

有効にする
# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.

composerをインストール

# curl -sS https://getcomposer.org/installer | php
コマンド設置
# mv composer.phar /usr/local/bin/composer

以下のコマンドで確認
# composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.1 2019-11-01 17:20:17

Laravelのインストーラーをダウンロード

# composer global require "laravel/installer"

プロジェクトを配置する場所のディレクトリのパーミッションを変更
(一旦、実行・書込・読込を許可)

# chmod 777 /var/www/html/

"sample"というプロジェクトを作成

$ composer create-project --prefer-dist laravel/laravel /var/www/html/sample

ドキュメントルート設定

# vi /etc/httpd/conf.d/***.conf(任意の名前)
<VirtualHost *:80>
    DocumentRoot /var/www/html/sample/public
    RewriteEngine On
    <Directory "/var/www/html/sample/public">
        AllowOverride All
    </Directory>
</VirtualHost>

confを修正したのでhttpd再起動

# systemctl restart httpd

ログを書込権限がないので、パーミッションを変更
(一旦、実行・書込・読込を許可)

$ chmod -R 777 /var/www/html/sample/storage/

http://192.168.33.10 にアクセス
(Vagrantで構築したため、デフォルトの192.168.33.10)

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

Dockerで開発用のMySQLを構築する

Dockerでサクッと開発用のMySQLを構築する

勉強用にサクッとMySQLの環境がほしかったのでメモ。

環境

Docker Desktop 2.1.0.5

構築と利用

MYSQL_ALLOW_EMPTY_PASSWORDでパスワード不要にする。

$ docker run --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql:5.7

docker containerに入ってMySQLを試す。

$ docker exec -it mysql mysql

削除

終わったら削除する。

$ docker stop mysql
$ docker rm mysql

参考

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

DockerのMySQLに,GDALを使ってシェープファイルをインポートしてみる

概要

 本記事では,Docker環境において,シェープファイルをもとにしたジオメトリデータを提供するサーバを構築してみます.
ジオメトリデータはMySQLに格納し,クライアントからのリクエストに応じてデータを受け渡すことを想定します.

 シェープファイル のジオメトリデータを MySQL にインポートするには,GDALというGISライブラリの ogr2ogr を用います.GDALのインポート方法はいくつかあるのですが,本記事ではGDALのDockerイメージを使用します.例としてNode.js(Express)のDockerアプリにGDALを組み込んで,Docker Composeで構築していきます.

環境

  • Windows10 Pro 64bit
  • Docker for Windows 19.03.2
  • docker-conpose 1.24.1
  • Node.js 12.13.0 ※expressの雛形形成のためにローカルで使います
  • npm --version 6.12.0

実装

Expressの雛形を準備

 ExpressのDocker環境の構築は,基本的に docker-compose(Docker for mac)で実践的なnode.js開発環境を作る の手順を継承します.

 まず,作業ディレクトリでexpressexpress-generatorをインストールします.ただし,global環境へのインストールは避けたいので,下記のようにします.

$ npm install --save express
$ npm install --save express-generator

 次に,雛形を作るコマンドを実行します.npmでライブラリをローカルにインストール際にはpathが通らないので,下記のようにcmdファイルを指定します.myappは各自任意の命名をしてください.
 テンプレートエンジンはhtmlをほぼそのまま扱える ejs を指定していますが,各自の開発に合わせて設定してください.なにも指定しない場合のデフォルトは,jadeになります.ejsやjadeの違いはこちらを参照.

$ ./node_modules/.bin/express.cmd myapp --view=ejs

 以上で ,myapp 配下に Express の雛形が生成されました.以降の作業ディレクトリは,./myapp 配下になります.

docker-compose.ymlの作成

 myapp直下に,下記の docker-compose.yml を置きます.

docker-compose.yml
version: '2'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - "./conf.d:/etc/nginx/conf.d"
    links:
      - node_express
    networks:
      - app-net

  node_express:
    image: node:6.9-alpine
    container_name: node_express
    hostname: node_express
    volumes:
      - ".:/src"
    working_dir: /src
    command: [sh, -c, npm install && npm start]
    ports:
      - "3000:3000"
    links:
      - mysql
    networks:
      - app-net

  mysql:
    image: mysql:5.7
    container_name: mysql
    hostname: mysql
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports:
      - "3306:3306"
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
    volumes:
      - ./db/mysql-data:/var/lib/mysql
    networks:
      - app-net

  gdal:
    image: osgeo/gdal:ubuntu-full-3.0.2
    container_name: gdal
    hostname: gdal
    volumes: 
      - "./geodata:/home"
    tty: true
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

 ポイントは,以下の3点.

  • gdalコンテナはtty: trueをつけないとコンテナが維持されない.
  • gdalコンテナは./geodata:/homeをマウントし,ここにMySQLに入力したいシャープファイルを配置する.
  • 各コンテナにnetworksを指定し,この後 MySQL の入出力データを各コンテナから通信できるようにする.

 また,参考記事と同様に./conf.dフォルダを作成し,その配下に下記 nginx 用のファイルを置きます.

nodejs.conf
server {
    listen 80;
    server_name _;
    client_max_body_size 10M;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://node_express:3000/;
    }
}

シェープファイルのダウンロード と 作業ディレクトリへの配置

 今回は例として,国土交通省が公開している国土数値情報のうち,低位地帯データ(神奈川県)のシェープファイルをインポートしてみます.
 ダウンロードサイトにアクセスし,神奈川県にチェックのうえアンケートに回答しダウンロードします.
G08-15_14_GML.zipがDLされたと思うので,解凍します.解凍したフォルダ内にG08-15_14.shpがあることを確認します.

 作業ディレクトリに戻り,docker-compose.ymlと同じ階層に ,docker-compose.yml内でgdalコンテナのマウント先に設定したgeodataフォルダを作成します.ここに先程解凍したデータをフォルダごと配置します.

Dockerコンテナの立ち上げ

 ここまでの作業でDockerコンテナを立ち上げる準備ができたので,docker-compose.ymlと同じ階層で下記コマンドを実行してコンテナを起動します.
 起動後,ブラウザからhttp://localhost:3000にアクセスして何か表示されれば成功です.また,$ docker psコマンドでコンテナが4つ起動していることを確認します.

$ docker-compose up -d --build

GDAL(ogr2ogr)を使って シェープファイル を MySQL にインポート

 まずはMySQLのDockerコンテナに入り,データベースを作成します.DBの名前はflood_mapとしていますが,ご自身の開発に合わせてDB名を設定します.

$ docker exec -i -t mysql bash
$ mysql -h 127.0.0.1 -u root -proot
mysql> create database flood_map;

 次に,gdalのDockerコンテナに入り,ogr2ogr を使ってMySQLにデータを入れていきます.
 home ディレクトリ配下にシェープファイルを含むファイル群がマウントされますので,ご自身の環境にあわせてシェープファイルを指定します.MySQLのホスト名はMySQLのコンテナ名を指定することでうまくいきます.

$ docker exec -i -t gdal bash
$ ogr2ogr -f "MySQL" MySQL:"flood_map,host=mysql,user=root,password=root,port=3306" ./home/G08-15_14_GML/G08-15_14.shp

MySQLでデータを確認しインデックスを張る

 再び MySQL コンテナに戻り,SQLを実行してみてデータが入っていることを確認します.たくさん表示すると問題があるので,上から10件のデータを表示してみます.

mysql> use flood_map;
mysql> SELECT ogr_fid,AsText(Envelope(ExteriorRing(shape))) from g08_15_14 limit 10;

+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ogr_fid | AsText(Envelope(ExteriorRing(shape)))                                                                                                                                                |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|       1 | POLYGON((139.52142804001 35.6371572663072,139.523032038531 35.6371572663072,139.523032038531 35.6379951881551,139.52142804001 35.6379951881551,139.52142804001 35.6371572663072))    |
|       2 | POLYGON((139.521452996084 35.6376134289269,139.521644357377 35.6376134289269,139.521644357377 35.6376736855994,139.521452996084 35.6376736855994,139.521452996084 35.6376134289269)) |
|       3 | POLYGON((139.52196220354 35.6369668672147,139.522425630462 35.6369668672147,139.522425630462 35.6371686759932,139.52196220354 35.6371686759932,139.52196220354 35.6369668672147))    |
|       4 | POLYGON((139.541073491975 35.6360655457882,139.543607066891 35.6360655457882,139.543607066891 35.6382958203003,139.541073491975 35.6382958203003,139.541073491975 35.6360655457882)) |
|       5 | POLYGON((139.540973950349 35.6380131944947,139.541300259083 35.6380131944947,139.541300259083 35.6382231275051,139.540973950349 35.6382231275051,139.540973950349 35.6380131944947)) |
|       6 | POLYGON((139.543183728112 35.6372670693054,139.543547637788 35.6372670693054,139.543547637788 35.6377649038623,139.543183728112 35.6377649038623,139.543183728112 35.6372670693054)) |
|       7 | POLYGON((139.543439171221 35.6369067894177,139.543604469296 35.6369067894177,139.543604469296 35.6370422598022,139.543439171221 35.6370422598022,139.543439171221 35.6369067894177)) |
|       8 | POLYGON((139.540877273964 35.6326687791813,139.543489041583 35.6326687791813,139.543489041583 35.6348299205534,139.540877273964 35.6348299205534,139.540877273964 35.6326687791813)) |
|       9 | POLYGON((139.20295027585 35.6304782158446,139.204943801785 35.6304782158446,139.204943801785 35.6336142552756,139.20295027585 35.6336142552756,139.20295027585 35.6304782158446))    |
|      10 | POLYGON((139.541693310682 35.6317030003044,139.544202942505 35.6317030003044,139.544202942505 35.6332801242532,139.541693310682 35.6332801242532,139.541693310682 35.6317030003044)) |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

 SQLの説明をすると,MySQLにはジオメトリデータを扱うための関数が用意されています.今回 g08_15_14 テーブルの shape カラムの中に格納されているものは,POLYGON型(≒多角形)のデータで,それぞれが低位地帯の1領域を表します.ExteriorRing()で POLYGON の外周を構成する座標の集合を取得できます.またDB内にはデータがバイナリで保存されていますが,AsText(Envelope()) で人間の読める形に変換しています.

 データが格納されていることが確認できたら,インデックスを張ります.MySQLにはジオメトリデータ用のインデックスが用意されています.

mysql> ALTER TABLE g08_15_14 ADD SPATIAL INDEX(shape);

DBアクセス用のユーザ作成

 rootを使ってDBにアクセスするのはセキュリティ的によろしくないので,権限を絞ったユーザを作成します.APIサーバからアクセスする際はユーザを使ってアクセスすることを想定します.

mysql> CREATE USER 'user1'@"%" IDENTIFIED BY "user1";
mysql> GRANT SELECT ON flood_map.g08_15_14 TO user1@"%";

【補足】SRIDについて

 ジオメトリデータにはSRID(空間参照識別子)があります.SRIDが何かについて詳細はこちら.今回の神奈川県の低位地帯データは,JGD2011の緯度経度の座標系ですので,本来はSRIDは6668が設定されているべきです.ただ,MySQL5.7でogr2ogrを使うと,SRIDを1から連番で振ってしまいます.※MySQL8であれば正しく設定される模様...

mysql> SELECT * from geometry_columns;
+-----------------+----------------+--------------+-------------------+-----------------+------+---------+
| F_TABLE_CATALOG | F_TABLE_SCHEMA | F_TABLE_NAME | F_GEOMETRY_COLUMN | COORD_DIMENSION | SRID | TYPE    |
+-----------------+----------------+--------------+-------------------+-----------------+------+---------+
| NULL            | NULL           | g08_15_14    | SHAPE             |               2 |    1 | POLYGON |
+-----------------+----------------+--------------+-------------------+-----------------+------+---------+

SRIDが6668だと思ってるとエラーになります.

mysql> SET @g1 = GeomFromText('Polygon((139.695773 35.532169,139.695773 35.5068084,139.615388 35.5068084,139.615388 35.532169,139.695773 35.532169))', 6668);
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select count(*) from g08_15_14 where MBRIntersects(SHAPE, @g1) = 1;
ERROR 3033 (HY000): Binary geometry function mbrintersects given two geometries of different srids: 1 and 6668, which should have been identical.

 下記であれば通ります.

mysql> SET @g1 = GeomFromText('Polygon((139.695773 35.532169,139.695773 35.5068084,139.615388 35.5068084,139.615388 35.532169,139.695773 35.532169))', 1);
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select count(*) from g08_15_14 where MBRIntersects(SHAPE, @g1) = 1;
+----------+
| count(*) |
+----------+
|       29 |
+----------+
1 row in set (0.04 sec)

コンテナの終了

 下記コマンド実行.

$ docker-compose down

応用例(クライアント側の実装)

leafletで洪水ハザードマップを作成する【OpenStreetMap, 国土数値情報】

まとめ

 本記事では,Docker環境でジオメトリデータを扱うためのサーバ環境を構築し,実際にデータをMySQLに入れてみました.MySQL内のデータを取り出すためには,node.jsでSQLを叩くAPIを用意し,フロントからアクセスすれば実現可能です.

参考文献

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

MySQL の文字エンコーディングと照合順序の設定を確認する

公式ドキュメントの情報

MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.4 接続文字セットおよび照合順序

接続に適用する文字セットおよび照合順序システム変数の値を確認するには、次のステートメントを使用してください。

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

MySQL monitor から実行する例

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
mysql> show variables like 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

シェルから実行する例

$ echo "show variables like 'character%'; show variables like 'collation%';" | mysql -u your-account-name -p
Enter password: 
Variable_name   Value
character_set_client    utf8
character_set_connection    utf8
character_set_database  utf8mb4
character_set_filesystem    binary
character_set_results   utf8
character_set_server    utf8mb4
character_set_system    utf8
character_sets_dir  /usr/share/mysql/charsets/
Variable_name   Value
collation_connection    utf8_general_ci
collation_database  utf8mb4_general_ci
collation_server    utf8mb4_general_ci

使用可能な文字エンコーディング一覧

show character set で使用可能な文字エンコーディングのリストを確認できる。

mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)

参考資料

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

Rails6 usersテーブルにpasswordカラムが作成されなくて困った話

目的

  • マイグレーションファイルの記載を間違えてコマンド$ rails db:migrateを実行してしまい、その後記載を正しいものにしてもpasswordカラムが作成されなかった時の解決方などをまとめる。

結論

  • 一旦マイグレーションファイルを削除して再度マイグレーションファイルを作成し記載内容を確かめた上でrails db:migrateを実行した。

困りごとに至った経緯

  1. 自作プロダクトでログイン機能を実装したい。
  2. usersテーブルにはすでにnameカラムとemailカラムと初期設定カラムが作成されていたのでマイグレーションファイルを作成してpasswordカラムの追加を行おうと思った。
  3. コマンド$ rails g migration add_password_to_usersを実行した。作成されたマイグレーションファイル名は「20191211134100_add_password_to_users.rb」である
  4. マイグレーションファイルへの書き込みをしないままコマンド$ rails db:migrateを実行してしまう。
  5. マイグレーションファイルに記載をしていないことが判明、下記の内容を記載するもコードミスをする。(add_columnのnがない)

     class AddPasswordToUsers < ActiveRecord::Migration[6.0]
        def change
          add_colum :users, :password, :string 
        end
     end
    
  6. コードをミスっているマイグレーションファイルをコマンド$ rails db:migrateで反映させてしまう。

  7. マイグレーションファイルのコードミスに気がつき、修正し再度コマンド$ rails db:migrateを実行した。

  8. rails consoleにてusersテーブルのidが1のレコード情報をuserに格納しpasswordカラム情報を追記しようとしたところ下記のエラーが発生した。(passwordカラムなんて存在しないぜという感じのエラー)(エラーコード以外のrails console内での出力は省略)

    irb(main):001:0> user = User.find_by(id:1)
    irb(main):002:0> user.password = "0000"
    Traceback (most recent call last):
            1: from (irb):2
    NoMethodError (undefined method `password=' for #<User:0x00007fd0e2424fe0>)
    

解決までの経緯

  1. 現在のテーブルのカラムがどうなっているか知りたかったのでアプリ名/db/schema.rbを確認しに行った。下記に問題発生時のschema.rbを記載する。

    ActiveRecord::Schema.define(version: 2019_12_14_093144) do
    
      create_table "posts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
        t.text "content"
        t.datetime "created_at", precision: 6, null: false
        t.datetime "updated_at", precision: 6, null: false
        t.decimal "study_time", precision: 10
        t.text "hash_tag"
      end
    
      create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
        t.string "name"
        t.string "email"
        t.datetime "created_at", precision: 6, null: false
        t.datetime "updated_at", precision: 6, null: false
      end
    
    end
    
  2. 前述の結果からusersテーブルにpasswordカラムが存在していないことがわかる。

  3. マイグレーションファイルが空状態やコードミス状態でのコマンド$ rails db:migrateの実行もありなんとなく原因がわかった。

  4. すでに、データベースに反映させたマイグレーションファイルはGit登録してしまっているので当該コミットをrevertするかマイグレーションファイルを作り直して再度コマンド$ rails db:migrateを実行するか迷った。

  5. マイグレーションファイルを再度作成し直してデータベースに反映させることにした。

  6. 下記コマンドを実行して引っ掻き回してしまったマイグレーションファイルを削除する。

    $ rm -rf アプリ名/db/migrate/20191211134100_add_password_to_users.rb
    
  7. 下記コマンドを実行してマイグレーションファイルを再作成した。

    $ rails g migration add_password_to_users
    
  8. 作成されたマイグレーションファイルにミスがない様に記載をした。下記に正しいマイグレーションファイルの内容を記載する。

    class AddPasswordToUsers < ActiveRecord::Migration[6.0]
      def change
        add_column :users, :password, :string 
      end
    end
    
  9. 下記コマンドを実行してマイグレーションファイルの内容をデータベースに反映させた。

    $ rails db:migrate
    >== 20191214093144 AddPasswordToUsers: migrating 
    >===============================
    >-- add_column(:users, :password, :string)
    >-> 0.0144s
    >== 20191214093144 AddPasswordToUsers: migrated (0.0145s) 
    >======================
    
  10. passwordカラムが追加されているか確かめるためアプリ名/db/schema.rbを確認しに行った。下記に問題発生時のschema.rbを記載する。

    ActiveRecord::Schema.define(version: 2019_12_14_093144) do
    
      create_table "posts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
        t.text "content"
        t.datetime "created_at", precision: 6, null: false
        t.datetime "updated_at", precision: 6, null: false
        t.decimal "study_time", precision: 10
        t.text "hash_tag"
      end
    
      create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
        t.string "name"
        t.string "email"
        t.datetime "created_at", precision: 6, null: false
        t.datetime "updated_at", precision: 6, null: false
        t.string "password"
      end
    
    end
    
  11. usersテーブル部分にt.string "password"の記載を発見したので無事passwordカラムが追加されていそう。

  12. rails consoleをでusersテーブルのidが1のユーザのpasswordが登録できるか試してみた。(エラーコードは出なかったためrails console内での出力は省略)

    $ cd アプリ名フォルダ
    $ rails console
    irb(main):001:0> user = User.find_by(id:1)
    irb(main):002:0> user.password = "0000"
    irb(main):003:0> user.save
    User Update (0.5ms)  UPDATE `users` SET `users`.`updated_at` = '2019-12-14 09:35:32.920487', `users`.`password` = '0000' WHERE `users`.`id` = 1
       (0.7ms)  COMMIT
    => true
    
  13. 値をデータベースに保存する時にtrueが出たためpasswordカラムが作成され、正常に値も格納されたことを確認できた。

  14. 今回の件にはあまり関係無いが、アプリ名/app/models/user.rbにpasswordカラムの空欄を弾く様にバリデーションを追記した。下記にuser.rbの内容を記載する。

    class User < ApplicationRecord
        validates :email, {presence: true, uniqueness: true}
        validates :name, {presence: true}
        validates :password, {presence: true}
    end
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む