- 投稿日:2019-12-15T23:36:36+09:00
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
- 投稿日:2019-12-15T23:12:37+09:00
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',以上
- 投稿日:2019-12-15T19:15:14+09:00
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 httpdPHP インストール
- PHP5.4
CentOS7の標準リポジトリのPHPバージョンが5.4
(古い...サポート切れてるやろ)
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-releaseREMIリポジトリをインストール(リポジトリの依存関係によりEPELリポジトリも同時にインストールされる)
# yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpmPHP7.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 TechnologiesCentOS7からMariaDBが標準となっているため、
MySQLをインストールするためには削除する必要がある。# yum remove mariadb-libs # rm -rf /var/lib/mysqlMySQLのリポジトリをインストール
# yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpmMySQLインストール
# 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:17Laravelのインストーラーをダウンロード
# 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)
- 投稿日:2019-12-15T18:32:09+09:00
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.7docker containerに入ってMySQLを試す。
$ docker exec -it mysql mysql削除
終わったら削除する。
$ docker stop mysql $ docker rm mysql参考
- 投稿日:2019-12-15T07:19:14+09:00
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開発環境を作る の手順を継承します.
まず,作業ディレクトリで
express
とexpress-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.ymlversion: '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.confserver { 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 --buildGDAL(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.shpMySQLでデータを確認しインデックスを張る
再び 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を用意し,フロントからアクセスすれば実現可能です.
参考文献
- docker-compose(Docker for mac)で実践的なnode.js開発環境を作る: https://qiita.com/devalon/items/dd0fdce02156855b5df5 (accessed 2019/12/8).
- MySQLに対応したogr2ogr(GDAL)をインストールする方法まとめ: https://qiita.com/miyauchi/items/87921eb3ad630db1624a (accessed 2019/12/8).
- GISのための測地成果、測地系、楕円体、投影座標系、EPSGコードのまとめ: http://tmizu23.hatenablog.com/entry/20091215/1260868350 (accessed 2019/12/8).
- MySQL 空間分析関数: https://dev.mysql.com/doc/refman/5.6/ja/spatial-analysis-functions.html (accessed 2019/12/8).
- 投稿日:2019-12-15T00:23:38+09:00
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)参考資料
- 投稿日:2019-12-15T00:12:56+09:00
Rails6 usersテーブルにpasswordカラムが作成されなくて困った話
目的
- マイグレーションファイルの記載を間違えてコマンド
$ rails db:migrate
を実行してしまい、その後記載を正しいものにしてもpasswordカラムが作成されなかった時の解決方などをまとめる。結論
- 一旦マイグレーションファイルを削除して再度マイグレーションファイルを作成し記載内容を確かめた上で
rails db:migrate
を実行した。困りごとに至った経緯
- 自作プロダクトでログイン機能を実装したい。
- usersテーブルにはすでに
name
カラムとpassword
カラムの追加を行おうと思った。- コマンド
$ rails g migration add_password_to_users
を実行した。作成されたマイグレーションファイル名は「20191211134100_add_password_to_users.rb」である- マイグレーションファイルへの書き込みをしないままコマンド
$ rails db:migrate
を実行してしまう。マイグレーションファイルに記載をしていないことが判明、下記の内容を記載するもコードミスをする。(add_columnのnがない)
class AddPasswordToUsers < ActiveRecord::Migration[6.0] def change add_colum :users, :password, :string end endコードをミスっているマイグレーションファイルをコマンド
$ rails db:migrate
で反映させてしまう。マイグレーションファイルのコードミスに気がつき、修正し再度コマンド
$ rails db:migrate
を実行した。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>)解決までの経緯
現在のテーブルのカラムがどうなっているか知りたかったので
アプリ名/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前述の結果からusersテーブルにpasswordカラムが存在していないことがわかる。
マイグレーションファイルが空状態やコードミス状態でのコマンド
$ rails db:migrate
の実行もありなんとなく原因がわかった。すでに、データベースに反映させたマイグレーションファイルはGit登録してしまっているので当該コミットをrevertするかマイグレーションファイルを作り直して再度コマンド
$ rails db:migrate
を実行するか迷った。マイグレーションファイルを再度作成し直してデータベースに反映させることにした。
下記コマンドを実行して引っ掻き回してしまったマイグレーションファイルを削除する。
$ rm -rf アプリ名/db/migrate/20191211134100_add_password_to_users.rb下記コマンドを実行してマイグレーションファイルを再作成した。
$ rails g migration add_password_to_users
作成されたマイグレーションファイルにミスがない様に記載をした。下記に正しいマイグレーションファイルの内容を記載する。
class AddPasswordToUsers < ActiveRecord::Migration[6.0] def change add_column :users, :password, :string end end下記コマンドを実行してマイグレーションファイルの内容をデータベースに反映させた。
$ rails db:migrate >== 20191214093144 AddPasswordToUsers: migrating >=============================== >-- add_column(:users, :password, :string) >-> 0.0144s >== 20191214093144 AddPasswordToUsers: migrated (0.0145s) >======================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 endusersテーブル部分に
t.string "password"
の記載を発見したので無事passwordカラムが追加されていそう。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値をデータベースに保存する時にtrueが出たためpasswordカラムが作成され、正常に値も格納されたことを確認できた。
今回の件にはあまり関係無いが、
アプリ名/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