キムラデービーブログ 2024-01-28T07:11:13+09:00 オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。 JUGEM 2024年のFirebird(展望) http://blog.kimuradb.com/?eid=877716 2023-12-25T23:27:00+09:00 2024-01-02T14:28:22Z 2023-12-25T14:27:00Z 本エントリはFirebird Advent Calendar 2023 25日目のエントリです。
# 実際に書いているのは2024-01-02です orz
毎年ここにかく2023年のFirebirdについては、1日目のエントリに書きましたので、そちらをご覧ください。
Firebird 2023年の振り返り
現在、Firebi... meijik Firebird/InterBase Firebird Advent Calendar 2023 25日目のエントリです。
# 実際に書いているのは2024-01-02です orz
毎年ここにかく2023年のFirebirdについては、1日目のエントリに書きましたので、そちらをご覧ください。
Firebird 2023年の振り返り
現在、Firebird 5.0が開発中ですが、Firebird 4.0のレプリケーションような大きな機能追加はなく、
細やかな改善のように見えます。(それはFirebird 4.0のODSバージョンが13.0に対して、13.1というのにも現れています)
Firebirdは良くも悪くも現在の大きな流れに対して、既存のユーザー以外には中途半端な立ち位置にあると思います。
SQLiteのように組み込みに特化して、高機能になる、というわけでもなく、
かといってPostgreSQLやMySQLが目指す大規模対応、新しい試みのRDBMSのフロントエンドになる、というわけでもなく、
かといってCloudで扱いやすい、というものでもありません。
Firebird以外の2023年RDBMS界隈はどうでしたでしょうか?
2年前にまとめたときから、さらにクラウド化が進んでいる現状です。
2022年のFirebird
こばさんのまとめをみると全貌がわかりやすいと思います。
[個人的]データベースゆく年くる年(2023)
残念ながらどこにもFirebirdが関連しそうな要素がありません。。。 orz
2023年は世界五大クラウドからIBMが退場して、Oracleが入れ替わったような印象を受けます。
2023年の世界におけるSaaS企業のトップ5社(MIICHISOFT)
DBに固執せず、プラットフォームとしてのクラウドをすすめるために、Microsoft Azueとの連携 や、
PostgreSQLのマネージドサービスを提供 したりしています。
新しい流れとしては、東芝のGridDBからクラウドでFreeプラン がでたり、
ノーチラスのTsurugiがリリース されたり、ということがありました。
GridDB自体は素晴らしいものだと思うのですが、いかんせん既存のOSSのフロントエンド(PostgreSQLやMySQL)ではなく、
独自にしてしまったのが、つらいところ。そのため既存の開発者を取り込むところでつまずいている印象を受けます。
Tsurugiはその点、NECさんにまかせてPostgreSQLをフロントエンドに据えたのは、いい割り切り具合だと思います。
後はどれだけ開発者がTsurugi独自の文化を活かした実装をするか、その利点をユーザに伝えるか、で、
Tsurugiを使おうとする人々をどれだけ巻き込んで、どれだけの教育をどれだけの期間でできるのか、にかかっていると思います。
Firebirdは既存のユーザの要望に応えつつ、JDBCや.Netを使ったオンプレアプリの組み込み(同梱)データベースとして新規ユーザを獲得できるように地道な活動を期待します。
]]> 最新版のInterBase 2020 Update 5 http://blog.kimuradb.com/?eid=877715 2023-12-24T11:39:00+09:00 2023-12-31T02:40:52Z 2023-12-24T02:39:00Z 本エントリはFirebird Advent Calendar 2023 24日目のエントリです。
# 実際に書いているのは2023-12-31です orz
Firebirdのフォーク元であるInterBaseは2020までは結構活発に開発されていましたが、2020以降は新バージョンは出ず、去年(2022年)12月にUpdate 4
そし... meijik Firebird/InterBase Firebird Advent Calendar 2023 24日目のエントリです。
# 実際に書いているのは2023-12-31です orz
Firebirdのフォーク元であるInterBaseは2020までは結構活発に開発されていましたが、2020以降は新バージョンは出ず、去年(2022年)12月にUpdate 4
そして今年(2023年)10月ににUpdate 5が出たのみでした。
Update4までの詳細は以下のエントリをご参照ください。
InterBase 2020 リリース ノート
Update5については、以下をご参照ください。
Embarcadero InterBase 2020 Update 5 のリリース
Update5については、ほぼバグ修正メインで、新規の機能追加とかはないようです。
]]> Firebird 5.0 リリースノートを読む:MERGEでの PLAN, ORDER BYのサポート http://blog.kimuradb.com/?eid=877714 2023-12-23T11:13:00+09:00 2023-12-31T02:27:34Z 2023-12-23T02:13:00Z 本エントリはFirebird Advent Calendar 2023 23日目のエントリです。
# 実際は2023-12-31に書いています orz
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):Support PLAN and ORDER BY on MERGE
MERGE INTO ta... meijik Firebird/InterBase Firebird Advent Calendar 2023 23日目のエントリです。
# 実際は2023-12-31に書いています orz
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):Support PLAN and ORDER BY on MERGE
MERGE INTO target [[AS] target_alias]
USING <source> [[AS] source_alias]
ON <join_condition>
<merge_when> [<merge_when> ...]
[PLAN <plan-expr>]
[ORDER BY <ordering-list>]
[RETURNING <returning_list> [INTO <variables>]]
PLANやORDER BYについては、昨日のエントリ をご覧ください。
TsurugiもSQL的にはMERGEだけサポートすればいいと思ったけど、やることに対して構文が大仰すぎるからさけたのかなぁ。(TsurugiはMERGE未サポートです)
Available SQL features in Tsurugi
]]> Firebird 5.0 リリースノートを読む:「UPDATE OR INSERT」での PLAN, ORDER BY と ROWSのサポート http://blog.kimuradb.com/?eid=877713 2023-12-22T21:19:00+09:00 2023-12-30T12:25:51Z 2023-12-22T12:19:00Z 本エントリはFirebird Advent Calendar 2023 22日目のエントリです。
# 実際は2023-12-30に書いてます orz
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):Support PLAN, ORDER BY and ROWS on UPDATE OR INSERT
... meijik Firebird/InterBase Firebird Advent Calendar 2023 22日目のエントリです。
# 実際は2023-12-30に書いてます orz
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):Support PLAN, ORDER BY and ROWS on UPDATE OR INSERT
UPDATE OR INSERT INTO
target [(<column_list>)]
[<override_opt>]
VALUES (<value_list>)
[MATCHING (<column_list>)]
[PLAN <plan-expr>]
[ORDER BY <ordering-list>]
[ROWS <m> [TO <n>]]
[RETURNING <returning_list> [INTO <variables>]]
PLANは一般的なRDBMSでいうところのヒント句相当のものです。
実行計画をPLANで表示して、それをクエリに指定することができますが、それがUPDATE OR INSERT(一般的にと呼ばれるUPSERT)も対応したものです。
ユーザ指定のPLANの利用については以下のドキュメントが詳しいです。
Improved PLAN Clause(Firebird 2.1マニュアル)
オプティマイザが選ぶプランの表示はこちら
OPTIMIZATION OF SQL QUERIES IN FIREBIRD
またMySQLで利用できるORDER BYやLIMIT(同様のROWS)も対応しました。
なお、UPSERTをUPDATE OR INSERTで表現するのは、今のところFirebirdのみ。
そういえばノーチラスのTSURUGIも似たような表現だったなー、と検索したところ
INSERT OR REPLACE
でした。
Tsurugiのダンプ・ロード機能
# TsurugiのAdvent Calendarも今年(2023)あった んですねー。
insert or replaceの例(ひしだま)
上記のブログにもありますが、Tsurugiではinsert if not existsで存在しないデータだけのインサートもできます。
しかし、さらに調べると別名でUPDATE OR INSERTも利用できるみたいです。
update or insertの例(ひしだま)
INSERT OR REPLACEはSQLiteでも利用できる表記で、さらに短縮したREPLACEも利用できます。
MySQLでは古い表記でREPLACEを利用することもできます。ただMySQLのREPLACEはUPDATE相当の記述ができますが、SQLiteやTsurugiのINSERT OR REPLACEは、INSERT相当の記述しかできないようです。
]]> Firebird 5.0 リリースノートを読む: OPTIMIZE FOR句 http://blog.kimuradb.com/?eid=877712 2023-12-21T06:34:00+09:00 2023-12-25T21:37:04Z 2023-12-20T21:34:00Z 本エントリはFirebird Advent Calendar 2023 21日目のエントリです。
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):OPTIMIZE FOR 句
SELECT
...
[WITH LOCK [SKIP LOCKED]]
[OPTIMIZE FOR {FIRS... meijik Firebird/InterBase Firebird Advent Calendar 2023 21日目のエントリです。
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):OPTIMIZE FOR 句
SELECT
...
[WITH LOCK [SKIP LOCKED]]
[OPTIMIZE FOR {FIRST | LAST} ROWS]
この機能により、ユーザーアプリケーションによって最初にサブセット、または行のみがフェッチされる場合 (残りの行はオンデマンドでフェッチされる)、オプティマイザは別の (できればより良い) 計画を検討できるため、応答時間が改善されます。
# OPTIMIZE FOR 句は、最上位の SELECT でのみ使用できます。
類似のOPTIMIZE FOR 句はIBM Db2にも用意されており 、OPTIMIZE FOR n ROWS で指定します。これはFIRST相当の行数指定になります。LAST相当の指定はありません。
]]> Firebird 5.0 リリースノートを読む: カッコで囲まれたクエリー式 http://blog.kimuradb.com/?eid=877711 2023-12-20T08:40:00+09:00 2023-12-20T23:42:37Z 2023-12-19T23:40:00Z 本エントリはFirebird Advent Calendar 2023 20日目のエントリです。
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):Allow parenthesized query expressions
MySQL 8.0.22で実装され、関連して以前以下のエント... meijik Firebird/InterBase Firebird Advent Calendar 2023 20日目のエントリです。
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):Allow parenthesized query expressions
MySQL 8.0.22で実装され、関連して以前以下のエントリでFirebirdでの状況を説明した「カッコで囲まれたクエリー式(parenthesized query expressions)」がFirebird 5.0で実装されました。
MySQL 8.0.22が来た! カッコで囲まれたクエリー式(Parenthesized Query Expressions)(キムラデービーブログ)
リリースノートに書かれている以下の効果が期待できます。
「これにより、特にUNIONステートメントで、より表現力豊かなクエリが可能になりました。
特定のORMによって生成されたステートメントとの互換性が高まります」
]]> Firebird 5.0 リリースノートを読む: SKIP LOCKED句 http://blog.kimuradb.com/?eid=877710 2023-12-19T22:30:17+09:00 2023-12-19T13:30:17Z 2023-12-19T13:30:17Z 本エントリはFirebird Advent Calendar 2023 19日目のエントリです。
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):SKIP LOCKED clause
SKIP LOCKEDはロックを伴うSELECT (MySQL/PostgreSQLではFOR UPDATE, Fi... meijik Firebird/InterBase Firebird Advent Calendar 2023 19日目のエントリです。
本エントリに対応するリリースノートは次のエントリです。
10. Data Manipulation Language (DML):SKIP LOCKED clause
SKIP LOCKEDはロックを伴うSELECT (MySQL/PostgreSQLではFOR UPDATE, FirebirdではWITH LOCK)で利用でき、これにより他のトランザクションによってロックされたレコードを待機せずにスキップできます。
これがFirebird 5.0で実装されました。もともとはOracle DBの方言です。
Oracle : ○
SQL Server: ○(PASTREAD)
Db2 : ○(SKIP LOCKED DATA)
PostgreSQL: ○(9.5)
MySQL : ○(8.0)
Firebird : ○(5.0)
SQLite : ×(指定しても無視)
SQL標準 : ×
用途としては以下のようなシナリオがあります。
PostgreSQLのSKIP LOCKEDを使ってテーブルをキューとして使用する(Enjoy*Study)
ロッキングリードのNOWAITとSKIP LOCKEDオプションについて(MySQL道普請便り)
]]> Firebird 5.0 リリースノートを読む: 部分インデックス(Partial indices) http://blog.kimuradb.com/?eid=877709 2023-12-17T15:39:36+09:00 2023-12-17T06:39:36Z 2023-12-17T06:39:36Z 本エントリはFirebird Advent Calendar 2023 17日目のエントリです。
本エントリに対応するリリースノートは次のエントリです。
9. Data Definition Language (DDL):Support for partial indices
ここでいう「部分インデックス(Partial indices)」は、WHERE句で... meijik Firebird/InterBase Firebird Advent Calendar 2023 17日目のエントリです。
本エントリに対応するリリースノートは次のエントリです。
9. Data Definition Language (DDL):Support for partial indices
ここでいう「部分インデックス(Partial indices)」は、WHERE句で指定する以下のインデックスのことです。
Microsoft SQL Server:フィルター選択されたインデックス
PostgreSQL:部分インデックス
これがFirebird 5.0で実装されました。
# MySQLでいう長さで指定する(PREFIX的な)インデックス とは違います。
]]> やたら増えるログの闇に対する防衛術2023[MySQL] http://blog.kimuradb.com/?eid=877707 2023-12-16T17:43:33+09:00 2023-12-16T08:43:33Z 2023-12-16T08:43:33Z 本エントリは闇の魔術に対する防衛術 Advent Calendar 2023の16日目とMySQL Advent Calendar 2023 16日目のクロスエントリです。
1.プロローグ
兵隊「隊長! 今度採用したアプリケーション、バックエンドはMySQLですが、最新のMySQL 8.0を使っているらしく、やたらエラ... meijik MySQL 闇の魔術に対する防衛術 Advent Calendar 2023の16日目とMySQL Advent Calendar 2023 16日目のクロスエントリです。
1.プロローグ
兵隊「隊長! 今度採用したアプリケーション、バックエンドはMySQLですが、最新のMySQL 8.0を使っているらしく、やたらエラーログにWarningを出すんです」
隊長「なーにー、やっちまったなぁ」
2.防衛術:エラーログのフィルタリング
隊長「男は黙ってlog_error_suppression_list」
MySQL 8.0.13からlog_error_suppression_listがサポートされました。
これはdepricatedに対するWarningエラーのように「いわれなくてもわかってるよ〜」というエラー出力を抑制するのに便利です。具体的な設定などは、以下のマニュアルや技術ドキュメントをご参照ください。
5.4.2.5 優先度ベースのエラーログのフィルタリング (log_filter_internal)
第155回エラーログのフィルタリング(MySQL道普請便り)
3.起承「転」結
兵隊「隊長! 実は昔から使っているMySQLがあるんですが、なんかバイナリログの量がすごく増えててですね。この前ディスクフルを起こしたんですよ。これって生成量自体減らせないんですかねぇ」
隊長「最近のMySQL(5.7以降)はバイナリログのフォーマットのデフォルトが行単位だからなぁ(binlog_format=row)。いたしかたない。。。。いや、条件さえあえば、いくつか対策はあるゾ」
3.1 binlog-row-imageをデフォルトのfullから、minimalまたはnoblobにする。
MySQL 行ベースレプリケーションでは、各行変更イベントに 2 つのイメージ、つまり「前」イメージ (更新される行を検索するときにこれらのカラムが照合される) と「後」イメージ (変更を含む) が含まれます。
MySQL 5.6からはbinlog-row-image指定が使え、下記マニュアルにある条件さえあえば、minimalにしてバイナリログの量の削減が期待できます。
17.1.6.4 バイナリロギングのオプションと変数:binlog-row-image
3.2 binlog_transaction_compressionを使う
MySQL 8.0.20からbinlog_transaction_compressionを使ったMySQLバイナリログの圧縮が利用できます。
設定と効果については、以下の技術ブログが参考になります。
第207回binlog_transaction_compressionを使ったMySQLバイナリログの圧縮について(MySQL道普請便り)
では、十分なディスク容量を確保しつつ、突撃〜
]]> Firebird 5.0 リリースノートを読む http://blog.kimuradb.com/?eid=877708 2023-12-16T15:18:00+09:00 2023-12-17T06:21:37Z 2023-12-16T06:18:00Z 本エントリはFirebird Advent Calendar 2023 16日目のエントリです。
本エントリの元ネタは以下のエントリです。
[HTML]
Firebird 5.0 Release Candidate 2 Release Notes : 2. New In Firebird 5.0
[PDF]
Firebird 5.0 Release Candidate 2 Release Notes
Fi... meijik Firebird Advent Calendar 2023 16日目のエントリです。
本エントリの元ネタは以下のエントリです。
[HTML]
Firebird 5.0 Release Candidate 2 Release Notes : 2. New In Firebird 5.0
[PDF]
Firebird 5.0 Release Candidate 2 Release Notes
Firebird 5.0 では、アーキテクチャや操作に変更を加えることなく、多くの改良が加えられています。
最も重要なのは次のとおりです。
• Parallel (multi-threaded) operation for backup/restore, sweep and index creation;
• Partial indices;
• SKIP LOCKED clause for SELECT WITH LOCK, UPDATE and DELETE statements;
• Inline minor ODS upgrade;
• Compiled statement cache;
• PSQL and SQL profiler;
• Support for WHEN NOT MATCHED BY SOURCE for MERGE statement;
• Support multiple rows for DML RETURNING;
• New built-in functions and packages;
• Denser record-level compression;
• Network support for scrollable cursors;
明日以降、これらのうちのいくつかを順にみていきます。]]> 最新のSQL標準(SQL:2023)とFirebird/MySQL/PostgreSQL。続き。 http://blog.kimuradb.com/?eid=877706 2023-12-15T23:40:10+09:00 2023-12-15T14:40:10Z 2023-12-15T14:40:10Z 本エントリは 以下のAdvent Calendarの15日目のクロスエントリです。
Firebird Advent Calendar 2023
MySQL Advent Calendar 2023
PostgreSQL Advent Calendar 2023
SQL標準は数年ごとにリリースされて、最新のものはSQL:2023となります。
原本は有償での販売に... meijik クロスデータベース
Firebird Advent Calendar 2023
MySQL Advent Calendar 2023
PostgreSQL Advent Calendar 2023
SQL標準は数年ごとにリリースされて、最新のものはSQL:2023となります。
原本は有償での販売になりますので、直前のドラフトや、紹介記事を元に内容をつかんでます。
今回は以下のエントリを参照しています。
SQL:2023 is finished: Here is what's new(Peter Eisentraut)
今回の変更・追加点の概略は以下のものになります。
1.既存の SQL 言語に対する(小さい)さまざまな変更
2.JSONに関連する新しい機能
3.プロパティグラフクエリ(PGO)の新しいパート
1.の多くのパートはFirebird Advent Calendar 2023の2日目から8日目まででMySQL/PostgreSQLも含めて紹介してきました。
今回はその続き10〜12日目で、以下の三つとなります。
SQL:2023 Firebirdの場合:ANY_VALUE (T626)
SQL:2023 Firebirdの場合:Non-decimal integer literals (T661)
SQL:2023 Firebirdの場合:Underscores in numeric literals (T662)
上記の項目について以下はそれぞれの対応表となります。
SQL:2023 Firebird MySQL PostgreSQL
T626 × 〇5.7 〇16
T661 △ △ 〇16
T662 × × 〇16
さすがにPostgreSQL、ここでも手堅いですねぇ。
]]> SQL:2023 Firebirdの場合:A new part for PGQ(property graph queries) http://blog.kimuradb.com/?eid=877705 2023-12-14T21:13:00+09:00 2023-12-14T22:44:41Z 2023-12-14T12:13:00Z 本エントリはFirebird Advent Calendar 2023 14日目のエントリです。
本エントリの元ネタは以下のエントリです。
SQL:2023 is finished: Here is what's new(Peter Eisentraut)
さすがにFirebird, MySQL, PostgreSQLでさえも、PGQには未対応です。
オラクルか... meijik Firebird/InterBase Firebird Advent Calendar 2023 14日目のエントリです。
本エントリの元ネタは以下のエントリです。
SQL:2023 is finished: Here is what's new(Peter Eisentraut)
さすがにFirebird, MySQL, PostgreSQLでさえも、PGQには未対応です。
オラクルからはOracle DBでPGXを使ったガイドが以下のようにありますが、
まぁオープンソース関連にまで波及するには、数年〜十数年かかりそうです。
プロパティ・グラフ開発者ガイド
]]> SQL:2023 Firebirdの場合:JSON features http://blog.kimuradb.com/?eid=877704 2023-12-13T06:00:00+09:00 2023-12-12T12:53:52Z 2023-12-12T21:00:00Z 本エントリはFirebird Advent Calendar 2023 13日目のエントリです。
本エントリの元ネタは以下のエントリです。
SQL:2023 is finished: Here is what's new(Peter Eisentraut)
Firebirdでは今回のSQL標準でのJSON拡張というより、そもそもネイティブのJSON型を... meijik Firebird/InterBase Firebird Advent Calendar 2023 13日目のエントリです。
本エントリの元ネタは以下のエントリです。
SQL:2023 is finished: Here is what's new(Peter Eisentraut)
Firebirdでは今回のSQL標準でのJSON拡張というより、そもそもネイティブのJSON型をサポートしておりません。
一応以下のような機能リクエストは出ていますが、未実装です。
Support native JSON datatype for columns as MySQL / PostgreeSql [CORE5148]
"as MySQL / PostgreSQL"といっているように、まずPostgreSQL, 次にMySQLでネイティブのJSON型データタイプそして、関連する関数などが現在提供されています。
MySQL 5.7以降で対応
5.7->8.0で順に拡張され、最新は8.0
MySQL 8.0のマニュアル
11.5 JSON データ型
12.18 JSON 関数
PostgreSQL 9.2以降、最新は16
PostgreSQL 15の日本語マニュアル
8.14. JSONデータ型
9.16. JSON関数と演算子
以下の技術ドキュメントでPostgreSQL9.2から12まで、どのように拡張されていったのかまとめがあります。
【最新版】PostgreSQLのJSONの仕様 – 各バージョンのリリース内容
]]> SQL:2023 Firebirdの場合:Underscores in numeric literals (T662) http://blog.kimuradb.com/?eid=877703 2023-12-12T21:30:45+09:00 2023-12-12T12:30:45Z 2023-12-12T12:30:45Z 本エントリはFirebird Advent Calendar 2023 12日目のエントリです。
本エントリの元ネタは以下のエントリです。
SQL:2023 is finished: Here is what's new(Peter Eisentraut)
Java 7で導入され、他言語にも提案され実装された「数値リテラルのアンダースコア」... meijik Firebird/InterBase Firebird Advent Calendar 2023 12日目のエントリです。
本エントリの元ネタは以下のエントリです。
SQL:2023 is finished: Here is what's new(Peter Eisentraut)
Java 7で導入され、他言語にも提案され実装された「数値リテラルのアンダースコア」
Underscores in Numeric Literals
データベースの世界ではまだ実装が進んでないイメージです。
Firebird未対応
SQL> select 1_000_000 from rdb$database;
Statement failed, SQLSTATE = 42000
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 1, column 9
-_000_000
SQL> select 0x_FFFF_FFFF from rdb$database;
X_FFFF_FFFF
============
0
MySQLも未対応です。
mysql> select 1_000_000;
ERROR 1054 (42S22): Unknown column '1_000_000' in 'field list'
mysql> select 0x_FFFF_FFFF;
ERROR 1054 (42S22): Unknown column '0x_FFFF_FFFF' in 'field list'
]]> SQL:2023 Firebirdの場合:Non-decimal integer literals (T661) http://blog.kimuradb.com/?eid=877702 2023-12-11T09:00:24+09:00 2023-12-11T00:00:24Z 2023-12-11T00:00:24Z 本エントリはFirebird Advent Calendar 2023 11日目のエントリです。
本エントリの元ネタは以下のエントリです。
SQL:2023 is finished: Here is what's new(Peter Eisentraut)
多くのプログラミング言語と同様に、16 進数、8 進数、および 2 進数の整数リテラル... meijik Firebird/InterBase Firebird Advent Calendar 2023 11日目のエントリです。
本エントリの元ネタは以下のエントリです。
SQL:2023 is finished: Here is what's new(Peter Eisentraut)
多くのプログラミング言語と同様に、16 進数、8 進数、および 2 進数の整数リテラルが可能になります。
これは、元ネタのSELECTを三行に分ければ、それぞれの対応具合がわかります。
Firebirdでは16進数にしか対応していません。
SQL&lg SELECT 0xFFFF from rdb$database;
CONSTANT
============
65535
SQL&lg SELECT 0o755 from rdb$database;
O755
============
0
SQL&lg SELECT 0b11001111 from rdb$database;
B11001111
============
0
これに対してMySQLは16進数と2進数に対応しています。
mysql> SELECT 0xFFFF;
+----------------+
| 0xFFFF |
+----------------+
| 0xFFFF |
+----------------+
1 row in set (0.00 sec)
mysql> SELECT 0o755;
ERROR 1054 (42S22): Unknown column '0o755' in 'field list'
mysql> SELECT 0b11001111;
+------------------------+
| 0b11001111 |
+------------------------+
| 0xCF |
+------------------------+
1 row in set (0.00 sec)
しかし、厳密に見ればMySQLはT661に対応していない、とも考えることができます。
規格は「整数」リテラルで、MySQLはそれぞれバイナリのまま受け入れているからです。
以下の技術ブログでは「未対応」扱いされていました。
SQL:2023 and how well MySQL and MariaDB comply
規格通り整数として戻すにはCASTしてやる必要があります。
mysql> SELECT cast(0xFFFF as signed);
+------------------------+
| cast(0xFFFF as signed) |
+------------------------+
| 65535 |
+------------------------+
1 row in set (0.01 sec)
mysql> SELECT cast(0b11001111 as signed);
+----------------------------+
| cast(0b11001111 as signed) |
+----------------------------+
| 207 |
+----------------------------+
1 row in set (0.00 sec)
もしくは、整数型のカラムに投入すると暗黙敵にキャストされます。
mysql> create table t1(i1 int);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t1 values(0xFFFF),(0b11001111);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+-------+
| i1 |
+-------+
| 65535 |
| 207 |
+-------+
2 rows in set (0.00 sec)
]]>