MySQLエラー1406「Data too long for column」の原因と解決法|BIT型カラムにはb'1'・b'0'を使う
MySQLエラー1406「Data too long for column」とは?
MySQLで作業中に、次のようなエラーに遭遇したことはありませんか?
ERROR 1406 (22001): Data too long for column 'isStudent' at row 1
このエラーは、カラムに許容サイズを超えるデータを格納しようとしたときに発生します。「そんなに長いデータを入れていないのに」と戸惑いがちですが、実はBIT型カラムに文字列リテラルをそのまま渡した場合にも起こる、非常に典型的なエラーです。
BIT型はビット値を格納するためのデータ型で、たとえばbit(1)なら1ビット分の容量しかありません。一方、文字列'1'は1バイト(8ビット)のデータとして扱われるため、bit(1)カラムには収まりきらず、「データが長すぎる」と判断されてしまうのです。
解決策:ビットリテラル b'1' / b'0' を使う
BIT型カラムに値を設定する際は、接頭辞「b」を付けたビットリテラルを使用します。構文は以下の通りです。
anyBitColumnName = b'1' または anyBitColumnName = b'0'
実際に検証してみよう
それでは、サンプルテーブルを作成して動作を確認しましょう。まずはテーブル作成のクエリです。
mysql> create table ErrorDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(10),
-> isStudent bit(1),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.70 sec)レコードの挿入
続いて、insertコマンドで複数のレコードを挿入します。ここでは数値の1と0を指定しているため、エラーは発生しません。
mysql> insert into ErrorDemo(Name,isStudent) values('John',1);
Query OK, 1 row affected (0.18 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Sam',0);
Query OK, 1 row affected (0.21 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Mike',0);
Query OK, 1 row affected (0.16 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Larry',1);
Query OK, 1 row affected (0.23 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Carol',1);
Query OK, 1 row affected (0.11 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Robert',0);
Query OK, 1 row affected (0.17 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('James',1);
Query OK, 1 row affected (0.18 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Bob',1);
Query OK, 1 row affected (0.19 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('David',1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Ricky',0);
Query OK, 1 row affected (0.17 sec)登録内容の確認
select文ですべてのレコードを表示してみましょう。
mysql> select *from ErrorDemo;
出力結果は以下の通りです。
+----+--------+-----------+ | Id | Name | isStudent | +----+--------+-----------+ | 1 | John | | | 2 | Sam | | | 3 | Mike | | | 4 | Larry | | | 5 | Carol | | | 6 | Robert | | | 7 | James | | | 8 | Bob | | | 9 | David | | | 10 | Ricky | | +----+--------+-----------+ 10 rows in set (0.00 sec)
実際の出力画面のキャプチャは以下の通りです。

isStudentカラムが空欄に見えるのは、BIT型の値が端末上でバイナリ文字として表示され、可視化されにくいためです。データ自体は正しく格納されています。
エラーが発生するケース
ここで、文字列リテラル'1'を使って更新を行うと、冒頭で紹介したエラーが発生します。
mysql> update ErrorDemo set isStudent='1' where Id=9; ERROR 1406 (22001): Data too long for column 'isStudent' at row 1
文字列'1'は8ビット分のデータであるため、1ビットしか持たないbit(1)カラムには格納できず、エラーとなるのです。
エラーの回避方法
このエラーを回避するには、'1'の前に接頭辞「b」を付けてビットリテラルにします。修正後のクエリは以下の通りです。
mysql> update ErrorDemo set isStudent=b'1' where Id=9; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0
今度は正常に実行されました。再度select文でテーブルを確認してみます。
mysql> select *from ErrorDemo;
出力結果:
+----+--------+-----------+ | Id | Name | isStudent | +----+--------+-----------+ | 1 | John | | | 2 | Sam | | | 3 | Mike | | | 4 | Larry | | | 5 | Carol | | | 6 | Robert | | | 7 | James | | | 8 | Bob | | | 9 | David | | | 10 | Ricky | | +----+--------+-----------+ 10 rows in set (0.00 sec)
実際の出力画面のキャプチャは以下の通りです。

isStudentカラムに注目してください。Id=9の行(David)に対して、値が正しく更新されています。
b'0'を設定した場合の挙動
次に、同じIdに対して値0を設定してみます。対応するIdの行には空の値が設定されます。あわせてNameも更新してみましょう。
mysql> update ErrorDemo set Name='Maxwell', isStudent=b'0' where Id=9; Query OK, 1 row affected (0.16 sec) Rows matched: 1 Changed: 1 Warnings: 0
更新された特定の行を確認します。対象はId=9のレコードです。
mysql> select *from ErrorDemo where Id=9;
出力結果:
+----+---------+-----------+ | Id | Name | isStudent | +----+---------+-----------+ | 9 | Maxwell | | +----+---------+-----------+ 1 row in set (0.00 sec)
このように、Nameが「Maxwell」に更新され、isStudentにはb'0'が設定されたことが確認できました。
まとめ
MySQLのエラー1406「Data too long for column」は、BIT型カラムに文字列リテラルを渡したときにも発生します。BIT型カラムを操作する際は、必ずb'1'やb'0'のようなビットリテラルを使用しましょう。これにより、意図しないエラーを防ぎ、データを正しく格納できるようになります。
-
JavaとMySQLの接続エラーを解決するには?JDBCドライバ(コネクタ)をクラスパスに設定する方法
JavaからMySQLデータベースへ接続しようとした際に接続エラーが発生する場合、多くはMySQL Connector/J(JDBCドライバ)がJavaのクラスパスに登録されていないことが原因です。この問題を解決するには、MySQLコネクタのJARファイルをJavaのクラスパスに追加する必要があります。 解決方法:MySQLコネクタをクラスパスに追加する まず、MySQL公式サイトから「MySQL Connector/J」をダウンロードします。そのうえで、使用しているIDEのプロジェクトフォルダにコネクタのJARファイルをインポートしてください。 たとえば、Eclipseなら「プロジェクトのプ
-
MySQLクエリで列名にエイリアス(別名)を設定する方法
MySQLでは、SELECT文を使って列名に「エイリアス(別名)」を設定できます。エイリアスを利用すると、出力結果の見出しをわかりやすい名前に変更でき、レポート作成やアプリケーションでのデータ表示が格段に読みやすくなります。列名にエイリアスを設定する基本構文SELECT yourColumnName1 anyAliasName1, yourColumnName2 anyAliasName2FROM yourTableName anyAliasName;このように、列名の後にスペースを空けて任意の別名を記述するだけで、その列の表示名がエイリアスに置き換わります。テーブル名にも同様にエイリアスを設