数値型が文字列型になっちゃう問題
Codeigniterを使っていてたまに問題になるのが、DBの数値型が文字列型として取得される ということ。
これは MySQL の MYSQLI_OPT_INT_AND_FLOAT_NATIVE
が False
になっているせいだが、レンサバなどではこの値をいじれなかったりするのでカスタマイズしたり、エンティティを利用しなければならなかった。
DBから取得した値を比較しようとして
if($table["field"] === 1) {
// ここ通らないよ
}
となってしまうため、止む無く ==
を使っているケースもある。
Codeigniter 4.4.0 が来た!(8月25日)
地味にBreaking Changeがいっぱいあって戸惑うが、対象の関数を使っていることは多くない(私の利用ケースでは何もなかった)ので、移行に躓くことはあまりないと思われる。
ちなみにDeprecationsも結構ある
この中にひっそりと書いてあるのが Enhancements → Database の numberNative
である。
app/Config/Database.phpにnumberNativeが追加されている
つまりこれが、MYSQLI_OPT_INT_AND_FLOAT_NATIVE
の有効無効フラグということ。
なお、.env
には記載がない。
public array $default = [
'DSN' => '',
'hostname' => 'localhost',
'username' => '',
'password' => '',
'database' => '',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => true,
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
'numberNative' => false, // ← ココ
];
大分助かる(新規開発なら)
でも、falseが前提で作っちゃってるシステムを移行するのしんどいんだわ
やった方がいいのはわかるんだけど、最初の例でいうと
if($table["field"] === "1") {
// 文字列型で比較しちゃってる
}
こうやってしまっているので、これらを全部探して書き換えるのが・・・むーりー
つぎからがんばる
全然関係ないけど、charset
とDBCollat
のデフォルトを utf8mb4
にしてくれないかな・・・
たまに忘れて化けることがあるんだよねぇ・・・