- MySQL
MySQL 1366 Incorrect integer valueの直し方
ERROR 1366 (HY000): Incorrect integer value: '' for column 'qty' at row 1 は、整数の列に、整数として読めない値(ここでは空文字 '')を入れようとしたときのエラーです。 CSV の取り込みや、画面の入力欄が空のまま送られたときによく起きます。
空文字は「値が無い」ではなく、「文字数 0 の文字列」です。 値が無いことを表すなら NULL を入れます。
INSERT INTO i87 (qty) VALUES (''); -- ERROR 1366
INSERT INTO i87 (qty) VALUES (NULLIF('', '')); -- NULL が入る
確認環境:MySQL 8.0.46(既定の sql_mode に STRICT_TRANS_TABLES)、PyMySQL(確認日 2026年10月11日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL 1366 Incorrect integer valueの直し方」
どの値で、どうなるか
整数の列(qty int)と金額の列(price decimal(10,2))に、いろいろな文字列を入れました。
| 入れた値 | 結果(strict モード) |
|---|---|
''(空文字) |
1366 Incorrect integer value: '' |
'abc' |
1366 |
'123'(全角数字) |
1366 |
'1,000'(カンマ付き) |
1265 Data truncated for column 'qty' |
'12abc' |
1265 Data truncated |
' 12 '(前後に空白) |
入った(12) |
'12.6' |
入った(13 に四捨五入) |
'1e3' |
入った(1000) |
price に '' |
1366 Incorrect decimal value: '' |
price に '¥1,000' |
1366 Incorrect decimal value |
全角数字は数値として読まれず、エラーになりました。 一方、'12.6' はエラーにならずに 13 に丸められ、'1e3' は 1000 として入りました。エラーにならない変換もあるので、入れる前に値を整えるのが確実です。全角数字を半角にする方法は、関連記事の「全角⇔半角変換の早見表|Java・JS・Python・Excel・SQL」で扱っています。
危険:strict モードを外すと、黙って別の値が入る
エラーを消すために sql_mode から STRICT を外すと、次のように入りました。
SET SESSION sql_mode = '';
INSERT INTO i87 (qty) VALUES (''), ('abc'), ('1,000');
| 入れた値 | 実際に入った値 | 警告 |
|---|---|---|
'' |
0 | 1366 |
'abc' |
0 | 1366 |
'1,000' |
1 | 1265 |
「1,000 個」が「1 個」として、エラーにならずに保存されました。 空欄は「数量 0」になり、未入力と区別できなくなります。公式マニュアルでも、strict モードでないときは不正な値を調整して入れ、警告だけを出すとされています。sql_mode を緩めるのではなく、入れる値を直します。
直し方:SQL で変換する
| 変換 | 書き方 |
|---|---|
| 空文字を NULL に | NULLIF(値, '') |
| カンマを除く | REPLACE(値, ',', '') |
| 両方 | NULLIF(REPLACE(値, ',', ''), '') |
| 前後の空白を除いてから判定 | NULLIF(TRIM(値), '') |
INSERT INTO i87 (qty) VALUES (NULLIF('', '')); -- NULL
INSERT INTO i87 (qty) VALUES (REPLACE('1,000', ',', '')); -- 1000
LOAD DATA(CSV の取り込み)
code,qty,price
A01,10,100.00
A02,,200.00 ← 数量が空
A03,"1,000", ← カンマ付き、金額が空
LOAD DATA INFILE '/var/lib/mysql-files/i87.csv' INTO TABLE l87
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' IGNORE 1 LINES;
ERROR 1366 (HY000): Incorrect integer value: '' for column 'qty' at row 2
2行目の空欄でエラーになり、1行目も含めて1行も入りませんでした。 列をいったん @変数 で受け取り、SET で変換してから入れます(公式マニュアルの方法)。
LOAD DATA INFILE '/var/lib/mysql-files/i87.csv' INTO TABLE l87
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' IGNORE 1 LINES
(code, @qty, @price)
SET qty = NULLIF(REPLACE(@qty, ',', ''), ''),
price = NULLIF(@price, '');
code qty price
A01 10 100.00
A02 NULL 200.00
A03 1000 NULL
空欄は NULL、"1,000" は 1000 として入りました。 LOAD DATA の基本や、ファイルの置き場所(secure-file-priv)のエラーは、既存の記事「MySQL CSVインポート|LOAD DATA INFILEとエラー解決」で扱っています。
アプリから入れるとき
cur.execute('INSERT INTO i87 (qty) VALUES (%s)', ('',)) # DataError (1366, "Incorrect integer value: '' ...")
cur.execute('INSERT INTO i87 (qty) VALUES (%s)', (None,)) # 入る(NULL)
画面の入力欄が空のとき、空文字のまま DB に渡すと 1366 になりました。 アプリの側で、空なら None(NULL)、そうでなければ整数に変換してから渡します。
qty = int(text) if text.strip() else None
Java なら、setString("") ではなく、空なら setNull(1, Types.INTEGER)、そうでなければ setInt を使います(確認環境の MariaDB Connector/J でも、setString("") はエラーコード 1366、setNull は入りました)。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | どの値か | エラー文の '...'(空文字・全角・記号) |
| 2 | どの列・何行目か | for column '...' at row N |
| 3 | 空文字なら | NULLIF(値, '')、アプリでは None・setNull |
| 4 | カンマ・円記号 | REPLACE で除く |
| 5 | CSV の取り込み | @変数 と SET で変換 |
| 6 | sql_mode を緩めていないか | 緩めると 0 や 1 が黙って入る |
よくある質問
Q. 列を NOT NULL にしていると、NULL も入りません。
A. NOT NULL の列に NULL を入れると、別のエラー(1048 Column cannot be null)になります。空欄を許すなら列を NULL 可にするか、業務として決めた既定値(DEFAULT 0 など)を使います。ただし、0 と未入力を区別したいなら NULL 可にします。
Q. PostgreSQL では同じ場合どうなりますか。
A. PostgreSQL は、空文字を整数の列に入れると invalid input syntax for type integer: "" というエラーになります。関連記事の「PostgreSQL invalid input syntaxの直し方」で扱っています。
まとめ
- 整数・小数の列に、数値として読めない値を入れたエラー。多くは 空文字
- 空文字は値が無いことではない。
NULLIF(値, '')で NULL にする - 全角数字は 1366、カンマ付きは 1265。
'12.6'は 13、'1e3'は 1000 として黙って入る - strict を外すと、
'1,000'が 1、空欄が 0 として保存される - CSV は
@変数とSETで変換してから入れる - アプリでは、空なら None・setNull を渡す
参考・出典
確認日はいずれも 2026年10月11日です。
- MySQL 8.0 Reference Manual「Server SQL Modes」:https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html
- MySQL 8.0 Reference Manual「LOAD DATA Statement」:https://dev.mysql.com/doc/refman/8.0/en/load-data.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL 1366 Incorrect integer valueの直し方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。