Qt 6.3 がリリースされた頃くらいからでしょうか。
macOS / Linux 環境で動作してた Qt5 (qmake) プロジェクトを少しづつ Qt6 (cmake) に移行・確認する作業をしてます。
Qt5 と Qt6 で動作結果が異なるケースは徐々に減り、私の手持ちでは ODBC ドライバでSQL Server を扱うものだけが残りました。
Qt6 の QODBC で困ってた事
Qt5 -> Q6 では QODBC3 -> QODBC と変更するだけで済むと思ってたのですが...
細かい部分で差異があり、スムーズに移行できません。
私が遭遇した中で、特に大きな問題は 2 つです。
- データベースの NULL 値の扱いが Qt5 と異なる動作をする場合がある。
- プレースホルダを経由すると項目に余計な終端文字 (0x00, 0x00) が付加される。
これらは 0S や Qt6 / QODBC のバージョンによって発現するパターンが変わるため、なかなか現象・原因を特定できずにいました。
1 つ目は QVariant 型に入った結果セットの項目を isNull() で判別する処理の動作結果が、期待通り Qt5 と同様になる場合と、そうでない場合がありました。
2 つ目は、SQL の SELECT 文では問題ない(ように見える)のですが、INSERT, UPDATE 文を処理すると、データベース項目に終端文字が付加されてしまいます。
私は macOS で処理したデータを Linux (Qt5) で確認した際に動作の差異に気づき、Azure Data Studio で SELECT CAST(書き込んだ項目 AS VARBINARY) FROM...
等として内容を確認したところ、文字列の末尾に余計な終端文字を見つけました。
Qt 6.5.0 で再確認 -> OK!
その後、Qt6 のバージョンアップに伴い、細かい問題点も同時に解消されつつあり、Linux 環境では少し前に Qt 6.5.0 で問題ない事を確認してます。
macOS 環境は、本日の brew updateで qt, qt-unixodbc が outdated になったので、 brew upgrade を実行。qt, qt-unixodbc はそれぞれ 6.5.0 に更新されました。
早速、件のプロジェクトを試してみたところ、まったく問題ありません。
あの足掻きは何だったのかというくらい、すんなり動作しました。
これでやっと一区切りというか、ようやく Qt5 の頃に戻った感じです。
安心したいんだけど...
うろ覚えなのですが、過去のバージョンでも Linux 環境では一度はすべて解消してたような記憶もあります。
すっかり安心してたし、急ぐ案件ではないので、しばらく放置してたのですが...
間を空けて Qt6 をアップデートしたら、問題が再発してました。
諸事情により macOS に開発環境を移しても同様の結果でした。
そのうち解消されるだろうと、さらに放置してたのですが一向に改善しません。
特に最近のバージョンでもある Qt 6.4.3 で確認した際は、macOS で前述の 2 つの問題が同時に発現してたので、「もう Qt6 の ODBC は期待できないのかな...」と軽く絶望してました。
とりあえず、私の環境では macOS / Linux どちらも問題ないのは Qt 6.5.0 が最初です。
そろそろ Qt5 は忘れて Qt6 だけにしたいんだけど、もう大丈夫なのかな...
Qt Creator も10.0.1になったし、そもそも Qt6 推しだし、大丈夫かな...
大丈夫だといいな。
※追記
- 2023-05-26 Qt 6.5.1 (macOS: homebrew) 問題なし
- 2023-10-08 Qt 6.5.2 (macOS: homebrew) 問題なし
- 2023-11-02 Qt 6.6.0 (macOS: homebrew) 問題なし
- 2023-11-08 Qt 6.6.0 (Ubuntu: apt) 問題なし
もう大丈夫かな。