MySQL:TINYINT(1)の値
【問題】
MySQLの数値型TINYINTは8bitの値で-128~127の値を格納できるはずですが,JDBCアダプタにMySQL Connector/Jを使用してJavaアプリケーションからMySQLデータベースのTINYINT(1)のフィールドに値を書き込むと,実際に書き込まれる値は0か1にしかなりません。
また,このフィールドの値をNumber型やその派生クラスの型で受け取ろうとすると,ClassCastException例外が発生します。
【対応策】
JDBCアダプタのデフォルトでは,TINYINT(1)はBIT(1)とみなされます。そのためこの値の設定・取得はNumber型やその派生クラスではなくBoolean型になります。
TINYINTに-128~127を格納するには,TINYINT(4)と桁数指定することで対処できます。また,TINYINT(1)のまま-128~127の値を格納したい場合は,JDBCアダプタの設定としてJDBC URLに「tinyInt1isBit=false」のエントリを加えます。
例:「tinyInt1isBit=false」を含めたJDBC URL |
jdbc:mysql://ホスト名/データベース名?useUnicode=true&characterEncoding=UTF8&tinyInt1isBit=false |
■追記:
「tinyInt1isBit=false」は,TINYINT(1)で-128~127の値が指定可能だった旧版(5.0以前)のMySQLで構築したデータベースのデータを,スキーマ定義を変更することなく新版で使用するためのもののようです。そのため最新版のMySQLでデータベーススキーマ定義を1から作る場合はこの設定は避けるべきと思われます。
以上とは逆に,旧版のMySQLにおいて,TINYINT(1)をBooleanとして扱う設定もあります。
「transformedBitIsBoolean=true」という指定で,これはConnector/J 3.1.9以降で指定可能です。
Connector/J 3.1.xはMySQL4.1以降が対象になります。(出典)
この指定はMySQL5.0以降では指定する意味がありません。
■関連情報
MySQLの数値型:[4.1][5.1]
MySQL Connector/Jに対してJDBC URLで指定できるパラメータ:[5.0][5.1]
JDBCで値を受け渡すときのJavaの型:[5.0][5.1]
■関連書籍をAmazonで検索:[MySQL][JDBC]
●MySQL徹底入門 第3版 ~5.5新機能対応~ (kindle版)
←この記事が役に立ったという方はクリックお願いします。
| 固定リンク
「プログラミング」カテゴリの記事
- シェルスクリプト:「.svn」ディレクトリを一括削除する(2015.03.23)
- JavaScript:excanvasを使ってWebページに画像を表示する(2012.05.07)
- C言語:TRUEとFALSEの値(2012.05.06)
- Java:CSVパーサを作る(その3) - RFC4180対応 後編(2008.06.13)
- Java:CSVパーサを作る(その2) - RFC4180対応 前編(2008.06.12)
「MySQL」カテゴリの記事
- Java:MySQLに金額を格納する(2008.03.07)
- MySQL:4.1日本語問題(2008.02.11)
- WebObjects:MySQLのためのEOModelの設定(2008.02.01)
- MySQL:TINYINT(1)の値(2008.01.25)
「JDBC」カテゴリの記事
- MySQL:4.1日本語問題(2008.02.11)
- WebObjects:MySQLのためのEOModelの設定(2008.02.01)
- MySQL:TINYINT(1)の値(2008.01.25)