MySQL
ログイン
mysql -h host -u user -p database_name
データベース操作
作成 mysql> create database database_name;
削除 mysql> drop database database_name;
確認 mysql> show databases;
使用 mysql> use {db_name};
テーブル操作
削除 mysql> drop table if exists table_name;
カラム操作
確認 SHOW FULL COLUMNS FROM table_name ユーザー操作
作成 mysql> create user 'user_name'@'host_name' identified by 'password'
削除 mysql> drop user 'user_name'@'host_name'
確認
use mysql
select * from user;
Mysqlでたくさんログを出す
vim /etc/my.cnf.d/server.cnf にて
[mysqld]のブロックに以下を記述
code:cnf
general_log=1
general_log_file=/var/log/mysql/general-query.log
ログファイルを先に作っておく(念のため)
code:sh
mkdir -p /var/log/mysql/
touch /var/log/mysql/general-query.log
chmod 777 /var/log/mysql/general-query.log
既述後 mysql再起動
/etc/init.d/mysql restart
CentOS6でmysqlサービスの起動
service mysqld start
CentOS6でmysqlサービスを自動起動
chkconfig mysqld on
Mysql5.7で初期設定
mysql_secure_installation
Mysql5.7で初期パスワードの確認
grep 'temporary password' /var/log/mysqld.log
sqlファイルを取り込み
mysql -u root [テーブル名] < db/data.sql
CentOS7でmysqlサービスを自動起動
systemctl enable mysqld.service
mysqlでsocketエラーが出てRailsが接続できない
mysql_config --socket
ソケットファイル(?)の場所を確認。
上記のパスと、database.ymlのsocket項目とを一致させる
mysqlでDBの内容を取り出し(ダンプを取る)
mysqldump --single-transaction -h [host] -u [username] -p [database] > [filename]
ダンプの取り込み
mysql -h ホスト名 -u ユーザー名 -p データベース名 < dumpファイル名
gzファイルの場合 zcat [filename] | mysql -h [hostname] -u [username] -p [password] [database]
mysqlの言語設定を確認
mysql> show variables like 'character%';
コマンドラインからsqlファイルの実行
// hoge.sql内のSQLを実行。出力結果をout.txtに出力。
mysql -u [user] -p[password] [database name] < hoge.sql >out.txt
実行計画を見る
EXPLAIN {SQL}
使える型
table:整数型
型名 最小値 最大値 UNSIGNED最大値
TINYINT -128 +127 +255
SMALLINT -32768 +32767 +65535
MEDIUMINT -8388608 +8388607 +16777215
INT -2147483648 +2147483647 +4294967295
BIGINT -9223372036854775808 +9223372036854775807 +18446744073709551615
table:固定小数点型
型名
DECIMAL(M, D) Mで有効桁数を、Dで小数部の精度を定義する
例えば DECIMAL(5, 2) を定義すると、最小値-999.99、最大値999.99
金銭管理みたいな、厳密な数値計算で使用する
table:浮動小数点型
型名 最小値 最大値
FLOAT -3.402823466E+38 〜 -1.175494351E-38 1.175494351E-38 〜 3.402823466E+38
DOUBLE -1.7976931348623157E+308 〜 -2.2250738585072014E-308 2.2250738585072014E-308 〜 1.7976931348623157E+308
table:文字列型
型名 Mの最大値 挿入に必要なサイズ
CHAR(M) 255 Mバイト
VARCHAR(M) 65535 格納データ+1バイト
TINYBLOB 255 格納データ+1バイト
BLOB 65535 格納データ+2バイト
MEDIUMBLOB 16777215 格納データ+3バイト
LONGBLOB 4294967295 格納データ+4バイト
TINYTEXT 255 格納データ+1バイト
TEXT 65535 格納データ+2バイト
MEDIUMTEXT 16777215 格納データ+3バイト
LONGTEXT 4294967295 格納データ+4バイト
table:列挙型
型名 定義できるパターン数 サイズ
ENUM 65535 1〜2バイト
SET 64 1〜8バイト 一つのセルに複数の値を格納できるENUM
table:日付・時刻型
型名 フォーマット 値の範囲
DATE YYYY-MM-DD 1000-01-01 〜 9999-12-31
TIME HH:MM:SS -838:59:59 〜 838:59:59
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59
YEAR YYYY (4桁) 0000, 1901 ~ 2155 (2桁) 70 〜 69(1970 〜 2069となる)
railsに使うユーザ
railsに使うユーザは、パスワード使う事を強制されるっぽいので、ユーザ作るときにパスワードを設定する事
mysqlの結果セット受信について
長年の謎だった
MySQL Connector Cではクエリの結果を読み込むためにmysql_store_resultかmysql_use_resultのどちらかを利用する必要があります。 多くの実装では mysql_store_result がデフォルトで使われるようになっています。パフォーマンス面での主な違いは前者が全ての結果を一度にMySQLから受け取るのに対して、後者は1レコードづつ受信する点です。
要は全レコード一気にダウンロードしてるらしい。デフォルトは。
MySQL怖い話
ぐえ、find_byちょっと怖い挙動を見てしまいました。
code:sh
2 pry(main)> Role.find_by(logical_type: 'A&F Staff') (0.5ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
Role Load (0.8ms) SELECT roles.* FROM roles WHERE roles.logical_type = 'A&F Staff' LIMIT 1
id: 0,
code: "900",
name: "Secretary-General",
alias_name: "SG",
created_at: Thu, 14 Mar 2019 16:40:43 JST +09:00,
updated_at: Thu, 14 Mar 2019 16:40:43 JST +09:00,
logical_type: "sg"> ***logical_typeが'A&F Staff'ではない!!!***
次の例は、比較演算での文字列から数字への変換を示しています。
mysql> SELECT 1 > '6x'; -> 0
mysql> SELECT 7 > '6x'; -> 1
mysql> SELECT 0 > 'x6'; -> 0
mysql> SELECT 0 = 'x6'; -> 1
'roles'.'logical_type' = 'A&F Staff'で数値と文字を比較してるので、'roles'.'logical_type' = 0になって、logical_typeが0のSGが帰ってくる・・・
JSON形式のデータの中身を取り出す
json_column ->> "$.value"
認証方式のデフォルト設定方法
どこにも書いてねーんだけど?!
my.cnfにdefault_authentication_plugin=mysql_native_passwordはMySQL8.0以降は弾かれる
my.cnfにauthentication_policy=mysql_native_password,,とする事で認証方式を強要できる
厳密にはデフォルト認証方式を指定しているわけではないのがかゆい。