MySQL8でCHAR関数がドキュメントどおりになってない
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_char
を読むと、こう書いてある。
- CHAR(N,... [USING charset_name])
CHAR() は各 N 引数を整数として解釈し、それらの整数のコード値で指定された文字を構成している文字列を返します。NULL 値はスキップされます。
mysql> SELECT CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> SELECT CHAR(77,77.3,'77.3'); -> 'MMM'
MySQL5.7.29の場合
mysql [localhost:5729] {msandbox} ((none)) > SELECT CHAR(77,121,83,81,'76'); +-------------------------+ | CHAR(77,121,83,81,'76') | +-------------------------+ | MySQL | +-------------------------+ 1 row in set (0.00 sec)
ドキュメント通りですね。
MySQL8.0.19の場合
mysql [localhost:8019] {msandbox} ((none)) > SELECT CHAR(77,121,83,81,'76'); +--------------------------------------------------+ | CHAR(77,121,83,81,'76') | +--------------------------------------------------+ | 0x4D7953514C | +--------------------------------------------------+ 1 row in set (0.01 sec)
あるぇ?おかしい。。。
これ、バグっぽいな
バグレポを見る。
これはわりと関係しそうだけど直接的ではないんだよなー。
ただ、ドキュメントと違うというだけで、雰囲気的には8のそれも最初からそれならアリな感じはするんだよな。
そして
atsuizoさんからコメントを頂く。
なるほど、8.0.14で検証したら大丈夫。 ということはどこかのバージョンか、環境のせいでおかしいのかも?
MySQL8.0.19の場合 by docker
mysql> SELECT CHAR(77,121,83,81,'76'); +--------------------------------------------------+ | CHAR(77,121,83,81,'76') | +--------------------------------------------------+ | 0x4D7953514C | +--------------------------------------------------+ 1 row in set (0.00 sec)
同じだ。
MySQL8.0.18の場合 by docker
mysql> SELECT CHAR(77,121,83,81,'76'); +-------------------------+ | CHAR(77,121,83,81,'76') | +-------------------------+ | MySQL | +-------------------------+ 1 row in set (0.00 sec)
あ!今までの見え方になった・・・。
おそらくバージョンのせいっぽいぞ。
バグレポ
既に木村さんの方で出してもらってたようです。ありがたや。
解決方法
やはり木村さんに教えてもらいました。
MySQL :: MySQL 8.0 Reference Manual :: 4.5.1.1 mysql Client Options
試してみます
# mysql -uroot -p --skip-binary-as-hex Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.19 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SELECT CHAR(77,121,83,81,'76'); +-------------------------+ | CHAR(77,121,83,81,'76') | +-------------------------+ | MySQL | +-------------------------+ 1 row in set (0.00 sec)
ほんとだ、元の見え方になりました!
リリースノートを見る
8.0.19のリリースノートはこちら
When the mysql client operates in interactive mode, the --binary-as-hex option now is enabled by default.
mysqlクライアントが対話モードで動作する とき、--binary-as-hexオプションはデフォルトで有効になりました。
To disable hexadecimal notation, use --skip-binary-as-hex (Bug #24432545)
16進表記を無効にするには、--skip-binary-as-hex (バグ#24432545)を使用します
ここのことか!(分かりづらい…)
バグ対応で正しくしたのならドキュメントの方直すべきだべ…。
感想
今回は木村さんに全てやってもらって、僕は記事を挙げただけですw(木村さんありがとうございます)
そして、atsuizoさんに指摘してもらって8.0.19からの変更だと気づけましたし、そのあとのコメントの通り、これ誰が嬉しいのかよくわからない変更ですよね(苦笑)
マイナーながらもなかなかナニコレ的なものなので、こいつがいつか誰かの役に立てれば幸いです。