LoginSignup
2
0

CodeIgniter4.4.0にて、DBの数値型が数値で取得できるようになったぞ

Last updated at Posted at 2023-09-01

数値型が文字列型になっちゃう問題

Codeigniterを使っていてたまに問題になるのが、DBの数値型が文字列型として取得される ということ。
これは MySQL の MYSQLI_OPT_INT_AND_FLOAT_NATIVEFalse になっているせいだが、レンサバなどではこの値をいじれなかったりするのでカスタマイズしたり、エンティティを利用しなければならなかった。

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") {
    // 文字列型で比較しちゃってる
}

こうやってしまっているので、これらを全部探して書き換えるのが・・・むーりー

つぎからがんばる


全然関係ないけど、charsetDBCollatのデフォルトを utf8mb4 にしてくれないかな・・・
たまに忘れて化けることがあるんだよねぇ・・・

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0