hnwの日記

MySQL

MySQLのFLOAT型を使う理由が見つからない件

MySQLのデータ型としてFLOAT型という型があるのですが、これを採用するのは混乱の元ではないか?と感じたので、その詳細を紹介します。 そもそもこの話のきっかけは「MySQLで6桁までの小数点を丸めずに扱うならFLOAT型を使うべき理由」という記事が目に止ま…

PHPのmysqlndの圧縮プロトコルについてのメモ

PHP+PDO+MySQLの環境では、PHP-MySQL間の通信についてzlibを使った圧縮プロトコルを利用することができます。この機能は、DBサーバのCPU利用率に十分余裕があり、かつPHP-MySQL間のネットワーク帯域が逼迫している状況で有用です。 MySQLの圧縮プロトコルと…

RubyとPythonとC#のround関数のバグっぽい挙動について

(12/29 20:40追記)「(追記)なぜMySQLのdecimal型を例に使ったかについて」というセクションを追加しました。また、コメントを頂戴したので返信しました。 (12/29 21:30追記)C#について言えば「Math.Round メソッド (Double, Int32)」に内部実装がどうなっ…

MySQLの自前strtod実装がタコすぎる

MySQL5.1のソースコードを確認していたところ、浮動小数点数の10進表記から浮動小数点数への変換処理に実装上の問題点を見つけました。浮動小数点数処理の典型的な落とし穴にはまっていて、計算の途中で精度を落としてしまっています。 これは古くから知られ…

MySQLの文字列型から数値型への自動型変換が意味不明すぎる

SQLでは違う型同士の演算で暗黙の型変換が起こります。この挙動はDBMSごとにバラバラであるため、混乱の元になることがあります。これについては徳丸さんが「SQLの暗黙の型変換はワナがいっぱい - 徳丸浩の日記」などで指摘されているので、一読をお勧めしま…

MySQLには1足せない数値リテラルがある

MySQLの数値リテラルに+1すると怒られたり、オーバーフローしたりすることがあります。下記は僕の手元のMySQL5.5.22での実行結果です。 mysql> select 9223372036854775807+1; ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 +…

MySQL5.1以降の小数の扱いがキモい

穏やかな昼下がりにMySQLで小数の足し算をしていたところ、不思議な現象を見つけました。 mysql> select 0.8=0.7+0.1; +-------------+ | 0.8=0.7+0.1 | +-------------+ | 1 | +-------------+ 1 row in set (0.00 sec) mysql> select 0.8=0.7+0.1e0; +----…

第18回オープンソーステクノロジー勉強会に参加してきました

追記:「1行の大きさの制約の65535バイトを4バイトまで拡張する」が意味不明だったのを修正しました。1行のサイズを2バイトで管理している関係で、通常のMySQLではBLOB型などを除外した1行のデータサイズが256^2-1=65535バイトまでに制限されているのですが…