ゆう's Blog
mysqldump

テーブル名を指定するだけで、個別テーブルのバックアップができます。
複数テーブルもスペース区切りで並べるだけです。

mysqldump -u root -p app_db users > users.sql

テーブル構造だけ

mysqldump -u root -p app_db users --no-data > users_schema.sql

データだけ

mysqldump -u root -p app_db users --no-create-info > users_data.sql

GRANTとREVOKE

GRANT は 上書きではなく追加
権限を減らしたいときは REVOKE が必須

・GRANT は追加のみ(上書きしない)
・REVOKE は削除のみ(他の権限に影響しない)

操作何が起きる?
GRANT SELECTSELECT が追加される
GRANT ALL全権限が追加される
REVOKE UPDATEUPDATE だけ消える
REVOKE ALL PRIVILEGESその DB に対する権限が全部消える

ユーザー権限は SHOW GRANTS で確認する

SHOW GRANTS FOR 'app_user'@'localhost';

USAGE(= 権限なし)が全体に付与されている
最終的な権限はこれらの“和集合”

データベースを DROP すると、その DB に対する権限は自動で削除される
ただし ユーザー自体は残る
他の DB や GLOBAL 権限には影響しない
MySQL は内部的に「存在しないデータベースに対する権限」を保持しない設計になっています。

FLUSH PRIVILEGES が必要なのは

“権限テーブルを直接編集したときだけ”

GRANT / REVOKE / CREATE USER / DROP USER では 不要。
実務では手動編集は避けるべき、MySQL は GRANT / REVOKE を使う限り自動で反映してくれる。

データベースの正しい流れ

① root で DB を作る(管理者作業)

CREATE DATABASE app_db;

② root でユーザーを作る(管理者作業)

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'xxx';

③ 必要最小限の権限だけ与える

GRANT SELECT, UPDATE, DELETE ON app_db.* TO 'app_user'@'localhost';

④ アプリはそのユーザーで DB に接続する

DB 作成
テーブル作成
ユーザー作成
権限管理
バックアップ
リストア
これらは root だけがやればよい。

LIKE検索時のエスケープ処理

$search_word = strtr($search_word, [ '\\' => '\\\\', '%' => '\%', '_' => '\_', ]);

DECIMAL (または NUMERIC) 型

CREATE TABLE `exchange` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `rate` decimal(5,2) NOT NULL, `time` int(10) UNSIGNED NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

DECIMAL (または NUMERIC) 型:
小数点以下の精度が重要な場合に使います。
例えば、金融や会計など、正確な計算が求められる分野で役立ちます。
例: DECIMAL(5,2) は最大5桁の数字のうち小数点以下2桁を許容します。

集計関数
集計関数用途
COUNT項目のデータ件数を取得する
SUM項目のデータ合計値を取得する
AVG項目のデータ平均値を取得する
MAX項目のデータ最大値を取得する
MIN項目のデータ最小値を取得する

<table style="margin: 1em auto;">

MySQLの組み込み関数(AES_ENCRYPTなど)を用いて暗号化したデータを保存する

AES_ENCRYPT('データ', '鍵')

キーの長さ: AESではキーの長さが暗号化の強度に影響します。AES_ENCRYPTでは、使用するキーの長さに基づいて暗号化が行われますが、長さが16バイト、24バイト、32バイト(128ビット、192ビット、256ビット)である必要があります。

指定したキーがそれ以外の長さの場合、MySQLは自動的にキーを適切な長さに切り詰めたり、ゼロ埋めを行う場合があります。

キーの長さが正確に16、24、32バイトの場合は、何の調整も行われずそのまま使用されます。

ゼロ埋めや切り捨ては、意図しない暗号化結果を引き起こす可能性があるため、使用するキーは明示的に適切な長さで生成することが推奨されます。

MySQLのAES_ENCRYPT関数は、ECBモードを使用します。このモードは各ブロックを独立して暗号化するため、初期化ベクトルを必要としません。
ECBモードの欠点として、同じ平文が同じ暗号文になるという特徴があります。これにより、暗号のパターンが推測されやすくなるという弱点があります。

AES_ENCRYPT(str, key) を使った場合、暗号化されたデータのサイズは以下のように決まります:

AESのブロックサイズは 16バイト(128ビット)です。
暗号化する文字列のサイズが 16バイトの倍数でない場合、パディングによってサイズが増加します。
暗号化後のデータサイズ ≈ 元のデータサイズ + (16 - 元のデータサイズ % 16)(パディングを考慮)

MySQL 8.0以降では、AES_ENCRYPTとAES_DECRYPTでAES-GCMモードをサポートするようになり、このモードでは暗号化に初期化ベクトル(IV)が内部的に使用されます。ただし、IVをユーザーが直接指定することはできません。システムが自動で管理します。
MariaDBでは、AES-GCMモードはサポートされていません。

暗号文サイズ = 平文のサイズ(バイト) + IVサイズ(12バイト) + 認証タグサイズ(16バイト)

AES-GCM以外の暗号化モード(例: AES-CBC, AES-ECBなど)では、認証タグが生成されない。
AES-GCMではパディングは発生しない。

MySQLのAES_ENCRYPT()はバイナリデータとして暗号化結果を返すため、保存するときはVARBINARYを使うのが適切です。

NOT NULL

「NOT NULL」を指定しない場合、デフォルトでそのカラムはNULL値を許容します。つまり、データを挿入するときにそのカラムの値を指定しなくても、NULL値が設定されます。

「NULL値を許容している場合」に「DEFAULT NULL」を明示的に指定しなくても、結果として同じ動作になります。つまり、デフォルトでNULL値が設定可能な状態となり、値を挿入しない場合そのカラムの値はNULLになります。

CREATE TABLE example_table1 ( column1 INT -- デフォルトでNULLが許容される );

CREATE TABLE example_table2 ( column1 INT DEFAULT NULL -- 明示的にNULLをデフォルト値として指定 );

この2つは動作に違いはなく、どちらの定義でもcolumn1に値を挿入しない場合はNULLが自動的に設定されます。ただし、「DEFAULT NULL」を明示することには利点があります。
例えば:
テーブルの定義をより読みやすくする(意図が明確になる)
他の開発者への理解を助ける

照会順序が影響する主な場面

文字列の比較
文字列の並べ替え(ソート)
LIKE句での部分一致検索
UNIONやDISTINCTでの重複排除
全文検索インデックス(FULLTEXT)