テーブル名を指定するだけで、個別テーブルのバックアップができます。
複数テーブルもスペース区切りで並べるだけです。
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 SELECT | SELECT が追加される |
| GRANT ALL | 全権限が追加される |
| REVOKE UPDATE | UPDATE だけ消える |
| REVOKE ALL PRIVILEGES | その DB に対する権限が全部消える |
ユーザー権限は SHOW GRANTS で確認する
SHOW GRANTS FOR 'app_user'@'localhost';
USAGE(= 権限なし)が全体に付与されている
最終的な権限はこれらの“和集合”
データベースを DROP すると、その DB に対する権限は自動で削除される
ただし ユーザー自体は残る
他の DB や GLOBAL 権限には影響しない
MySQL は内部的に「存在しないデータベースに対する権限」を保持しない設計になっています。
“権限テーブルを直接編集したときだけ”
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 だけがやればよい。
$search_word = strtr($search_word, [
'\\' => '\\\\',
'%' => '\%',
'_' => '\_',
]);
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;">
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」を指定しない場合、デフォルトでそのカラムは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)