2020/01/15

経緯

今回、クエリ互換性があるとのことでconvというMySQLのクエリ生成ツールをMariaDBへ対応することにした。

MariaDBとは

MariaDBはMySQLと互換性があるRDBで、MariaDBの公式ページにMySQLのバージョンとの対応が記載されている。

MariaDB versus MySQL - Compatibility

対応する上で、以下の形で作業することにした(MySQL5.6未満はconvではサポートしてないので、MariaDBでもサポートしない)

上記で変更した所、MariaDBの一部バージョンでテストがコケるようになったため修正のため調査した所、タイトルの件があった。

何が起こったか

MariaDB 10.2.7以降の information_schema.COLUMNS → COLUMN_DEFAULTは、クエリ実行時にクオートが必要なデフォルト値の場合はクオートも含むようになった。

MySQLや以前のMariaDBは、リテラルの場合でもクオートは取り除かれていた。

また、 DEFAULT NULL の場合、以前はCOLUMN_DEFAULTに値が入っていなかったのに対し、MariaDB10.2.7移行は「NULL」が文字列で入るようになった。

COLUMN_DEFAULTに入る値

この仕様変更については以下のCOLUMN_DEFAULTの説明に記載されている。

Information Schema COLUMNS Table

これが原因で、MariaDB10.2.7以降でのみ、カラムのデフォルトNULLなどがクオートされてしまい、クエリ実行時にエラーとなっていた

仕様変更の背景

information_schema.COLUMNSCOLUMN_DEFAULTから、デフォルト値が式かリテラルであるかの判別が出来ないため、リテラルにクオートを付ける形で対応した模様