VARBINARY型は、可変長のバイナリデータを格納するためのデータ型です。これは、テキストではなくバイナリデータ(画像、暗号化データ、ファイルの一部など)を扱う際に使用されます。
可変長: VARBINARY(n)のnは最大バイト数を指定します(nの範囲は1〜65535)。
バイナリデータとして扱う: 通常のVARCHAR型のように文字セットや照合順序の影響を受けません。
パディングなし: BINARY型とは異なり、格納時に余分なスペースで埋めることはありません。
InnoDB ストレージエンジンでは、1行のサイズが最大8126バイトに制限されます
TEXT型やBLOB型のデータは、一定サイズ以上になるとページ外(オーバーフロー領域)に保存されるため、行データサイズの制約を回避できますが、パフォーマンスに影響する可能性があります。
VARCHAR(n) は エンコーディングによって実際のバイトサイズが異なります。例えば、UTF-8の場合、1文字が最大4バイトになる可能性があります。
追加で1〜2バイトの長さ情報(Length Indicator)が必要です。
MySQLのTEXT型には具体的な「文字数の指定」がなく、最大保存可能なバイト数で制限されます。
TEXT型 | 最大サイズ |
---|---|
TINYTEXT | 255バイト |
TEXT | 65,535バイト |
MEDIUMTEXT | 16,777,215バイト |
LONGTEXT | 4,294,967,295バイト |
UTF-8エンコーディングの場合、日本語などのマルチバイト文字は1文字あたり最大3〜4バイトを使用します。
// 挿入したIDを取得 $id = $dbh->lastInsertId();
テーブル内のカラム名がidである必要はありません。この関数は、直前に実行されたINSERTクエリによって生成された自動インクリメント値を返します。そのため、カラム名が何であれ、テーブル内で自動インクリメントとして設定されているカラムであれば機能します。大事なのは、AUTO_INCREMENT属性が設定されているカラムを利用していることです。
UPDATEしても、カラムの値が変更されていなければ、更新されない
MySQLのTIMESTAMPは内部的にはUTCで保存されますが、クライアント(この場合はphpMyAdmin)に返す際に、セッションのタイムゾーンに従って変換されます。 もし@@session.time_zoneがSYSTEMになっている場合、MySQLはOSのタイムゾーン設定に依存して値を変換し、その変換後の値を返すため、phpMyAdminではOSのタイムゾーンでの値が表示されます。
タイムゾーンの設定確認
SELECT @@global.time_zone, @@session.time_zone;
優先順位: NOT > AND > OR
PHP 内でゼロ埋めを行う方法
データベースから取得した後、PHP の str_pad() 関数を使ってゼロ埋めすることもできます。
str_pad($value, 4, 0, STR_PAD_LEFT);
implodeを使った方法
メリット
シンプルで読みやすい:カンマ区切りの文字列として保存されるため、簡単に人間が読める形式になります。
検索性:文字列として保存されるため、特定の要素を簡単に検索したい場合に便利です。
デメリット
形式の制約:配列の要素が文字列であり、カンマを含まないことが前提です。もし要素にカンマが含まれていると、解析が困難になります。
情報の欠落:多次元配列やオブジェクトなど、単純な文字列としては表現できないデータ構造を扱う際に不向きです。
serializeを使った方法
メリット
柔軟性:多次元配列やオブジェクトなど、複雑なデータ構造もそのまま保存できます。
完全な保存:配列の情報をそのまま失わずに保存できるため、取り出した際に元の構造を保ったまま復元できます。
デメリット
読みやすさ:人間が直接読むのには向いていない形式です。デバッグや直接の確認が難しくなります。
互換性:シリアライズされたデータはPHP特有の形式であるため、他のプログラム言語やツールとの互換性がありません。
まとめ
シンプルな文字列として保存し、読みやすさや単純な検索性を重視するなら、implodeを使用する方法が適しています。
複雑なデータ構造をそのまま保存し、復元時に完全な形で取り出したい場合は、serializeを使用する方法が優れています。
// データを挿入または更新するSQL文 $sql = "INSERT INTO your_table (id, column1, column2) VALUES (:id, :column1, :column2) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2)"; $stmt = $pdo->prepare($sql); // パラメータの設定 $stmt->bindParam(':id', $id); $stmt->bindParam(':column1', $column1); $stmt->bindParam(':column2', $column2);
主キー(またはユニークキー)に基づいて動作します。これは、重複するキーがある場合にUPDATEを実行するためです。したがって、この構文を使用する場合は、必ずしもIDである必要はありませんが、ユニークキーまたは主キーに基づく必要があります。
複数のカラムを組み合わせてユニークキーを作ることは可能ですし、それを使ってINSERT ... ON DUPLICATE KEY UPDATE構文を使用することも可能です。実際、複合ユニークキーを設定すれば、複数カラムの組み合わせに基づいてINSERTまたはUPDATEを行うことができます。
例えば、次のように複合ユニークキーを設定します:
CREATE TABLE your_table ( id INT AUTO_INCREMENT PRIMARY KEY, column1 VARCHAR(255), column2 VARCHAR(255), column3 VARCHAR(255), UNIQUE KEY unique_key (column1, column2) );
このようにテーブルを作成した場合、column1とcolumn2の組み合わせがユニークキーとして機能します。これに基づいてINSERT ... ON DUPLICATE KEY UPDATE構文を使用する例を以下に示します:
// データを挿入または更新するSQL文 $sql = "INSERT INTO your_table (column1, column2, column3) VALUES (:column1, :column2, :column3) ON DUPLICATE KEY UPDATE column3 = VALUES(column3)"; $stmt = $pdo->prepare($sql); // パラメータの設定 $stmt->bindParam(':column1', $column1); $stmt->bindParam(':column2', $column2); $stmt->bindParam(':column3', $column3);
この例では、column1とcolumn2の組み合わせがユニークであるため、重複するデータがある場合にはcolumn3が更新され、重複しない場合には新しいレコードが挿入されます。
この方法なら複数カラムのユニーク性を活かしてデータの挿入および更新ができます。
CREATE TABLE your_table ( id INT AUTO_INCREMENT PRIMARY KEY, column1 VARCHAR(255) NOT NULL, column2 VARCHAR(255) NOT NULL, column3 VARCHAR(255), UNIQUE KEY unique_key (column1, column2) );
GUIでは「Null」にはできるが「空文字」にはできなかった。
なので、phpMyAdminの「SQL」タブを使用して、直接SQLクエリを実行した。
ALTER TABLE テーブル名 ALTER COLUMN カラム名 SET DEFAULT '';
シングルクオートは不可。