CharsetDiagnostics
in package
接続文字セットとカラム文字セットの食い違いを診断する
4 バイト文字(絵文字など)が壊れるのは「接続」と「カラム」のどちらかが utf8mb3 のときで、
どちらが狭いかによって対処が変わる(接続を直すのか、カラムを変換するのか)。
sql_mode から STRICT を外している都合で保存時は警告だけで例外にならず、
運用側から気付けないため、組み合わせを判定して管理画面に出す。
Table of Contents
Constants
- STATUS_BOTH_NARROW = 'both_narrow'
- 接続もカラムも utf8mb3。一貫しているが 4 バイト文字を扱えない
- STATUS_COLUMN_NARROWER = 'column_narrower'
- 接続は utf8mb4 だが utf8mb3 のカラムが残っており、そのカラムには 4 バイト文字が入らない
- STATUS_CONNECTION_NARROWER = 'connection_narrower'
- 接続が utf8mb3。utf8mb4 カラムへ 4 バイト文字を保存すると壊れる
- STATUS_OK = 'ok'
- 接続とカラムがどちらも 4 バイト文字を扱える
- STATUS_UNKNOWN = 'unknown'
- utf8 系以外の運用、またはカラム情報が取得できず判定できない
Properties
- $databaseName : string
- $engine : Base
- $tablePrefix : string
Methods
- __construct() : mixed
- columnCharsetCounts() : array<string, int>
- テーブル接頭辞に一致するテーブルについて、カラムの文字セットを集計する
- diagnose() : array{connection: string, status: string, caution: bool}
- 接続文字セットと、カラム文字セットとの組み合わせの判定結果を返す
- isCaution() : bool
- 対処が必要な状態かどうか
- judge() : string
- 接続文字セットとカラム文字セットの集計から状態を判定する
- isFourByteCapable() : bool
- isUtf8Family() : bool
- MySQL の `utf8` は utf8mb3 のエイリアスなので同一として扱う
Constants
STATUS_BOTH_NARROW
接続もカラムも utf8mb3。一貫しているが 4 バイト文字を扱えない
public
mixed
STATUS_BOTH_NARROW
= 'both_narrow'
STATUS_COLUMN_NARROWER
接続は utf8mb4 だが utf8mb3 のカラムが残っており、そのカラムには 4 バイト文字が入らない
public
mixed
STATUS_COLUMN_NARROWER
= 'column_narrower'
STATUS_CONNECTION_NARROWER
接続が utf8mb3。utf8mb4 カラムへ 4 バイト文字を保存すると壊れる
public
mixed
STATUS_CONNECTION_NARROWER
= 'connection_narrower'
STATUS_OK
接続とカラムがどちらも 4 バイト文字を扱える
public
mixed
STATUS_OK
= 'ok'
STATUS_UNKNOWN
utf8 系以外の運用、またはカラム情報が取得できず判定できない
public
mixed
STATUS_UNKNOWN
= 'unknown'
Properties
$databaseName read-only
private
string
$databaseName
$engine read-only
private
Base
$engine
$tablePrefix read-only
private
string
$tablePrefix
Methods
__construct()
public
__construct(Base $engine, string $databaseName, string $tablePrefix) : mixed
Parameters
- $engine : Base
- $databaseName : string
- $tablePrefix : string
columnCharsetCounts()
テーブル接頭辞に一致するテーブルについて、カラムの文字セットを集計する
public
columnCharsetCounts() : array<string, int>
文字セットを持たないカラム(int / blob / datetime 等)は集計対象外。
Return values
array<string, int> —文字セット名 => カラム数(多い順)
diagnose()
接続文字セットと、カラム文字セットとの組み合わせの判定結果を返す
public
diagnose() : array{connection: string, status: string, caution: bool}
集計の内訳が必要な場合は columnCharsetCounts() を直接呼ぶ。
Return values
array{connection: string, status: string, caution: bool}isCaution()
対処が必要な状態かどうか
public
static isCaution(string $status) : bool
Parameters
- $status : string
Return values
booljudge()
接続文字セットとカラム文字セットの集計から状態を判定する
public
static judge(string $connectionCharset, array<string, int> $columnCharsetCounts) : string
Parameters
- $connectionCharset : string
- $columnCharsetCounts : array<string, int>
Return values
stringisFourByteCapable()
private
static isFourByteCapable(string $charset) : bool
Parameters
- $charset : string
Return values
boolisUtf8Family()
MySQL の `utf8` は utf8mb3 のエイリアスなので同一として扱う
private
static isUtf8Family(string $charset) : bool
Parameters
- $charset : string