« Javadocで日本語APIリファレンスを作る | トップページ | WebObjects:日本語の基本 »

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版)

にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ プログラム・プログラマへ 人気ブログランキングへ ←この記事が役に立ったという方はクリックお願いします。


SoundLink Mini Bluetooth speaker_ii

|

« Javadocで日本語APIリファレンスを作る | トップページ | WebObjects:日本語の基本 »

プログラミング」カテゴリの記事

MySQL」カテゴリの記事

JDBC」カテゴリの記事

トラックバック


この記事へのトラックバック一覧です: MySQL:TINYINT(1)の値:

« Javadocで日本語APIリファレンスを作る | トップページ | WebObjects:日本語の基本 »