※この記事にはアフィリエイト広告(プロモーション)が含まれます。
MySQL で文字列をつなぐには CONCAT を使います。|| や + はエラーにならずに別の値を返します。この記事の出力は MySQL 8.4.11(Ubuntu 26.04)で採りました。
まず見る(結論)
SELECT CONCAT('abc', NULL) AS concat_null, -- NULL
CONCAT_WS('-', 'a', NULL, 'b') AS ws, -- a-b
CONCAT('abc', IFNULL(NULL, '')) AS ifnull_; -- abc
SELECT 'a' || 'b'; -- 0(既定の sql_mode では || は OR)
SELECT 'a' + 'b'; -- 0(+ は数値の足し算)
NULL が混ざると結果が NULL になる
SELECT id, CONCAT(name, ' ', mid) AS concat_, CONCAT_WS(' ', name, mid) AS ws FROM emp;
+----+------------+------------+
| id | concat_ | ws |
+----+------------+------------+
| 1 | 佐藤 一 | 佐藤 一 |
| 2 | NULL | 鈴木 | -- mid が NULL
| 4 | NULL | | -- name も mid も NULL
+----+------------+------------+
NULL を空文字として扱いたいときは、CONCAT_WS を使うか、列を IFNULL(mid, '') / COALESCE(mid, '') で包みます。
UPDATE でも同じです。UPDATE emp SET name = CONCAT(name, '様') を実行すると、name が NULL の行は NULL のまま残りました。エラーも警告も出ません。
|| と + は文字列を結合しない
SELECT 'a' || 'b' AS pipe; SHOW WARNINGS;
+------+
| pipe |
+------+
| 0 |
+------+
| Warning | 1287 | '|| as a synonym for OR' is deprecated and will be removed in a future release. Please use OR instead |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'b' |
既定の sql_mode では || は論理和(OR)です。'a' と 'b' が数値に変換されて 0 になり、0 OR 0 で 0 が返りました。警告は SHOW WARNINGS を実行しないと見えません。
+ も数値の足し算です。'a' + 'b' は 0、'1' + '2' は 3、'10円' + 5 は先頭の数字だけを使って 15 でした(警告 1292)。
PIPES_AS_CONCAT
SET SESSION sql_mode = CONCAT(@@sql_mode, ',PIPES_AS_CONCAT');
SELECT 'a' || 'b', 'a' || NULL;
ab | NULL
sql_mode に PIPES_AS_CONCAT を足すと || が文字列結合になります。sql_mode = 'ANSI' にも含まれます。他の DB から移した SQL で || を使っている場合、sql_mode を変えるより、CONCAT に書き換えるほうが設定に左右されません。
数値・日付との結合
SELECT CONCAT('No.', 5), CONCAT('a', 1.50), CONCAT('a', CURDATE());
No.5 | a1.50 | a2026-10-31
数値や日付は、そのまま渡しても文字列として結合されます。CONCAT は引数をいくつでも取れますが、CONCAT()(引数なし)は ERROR 1582 (42000): Incorrect parameter count in the call to native function 'CONCAT' になりました。
結合結果でエラーになるとき
| 状況 | エラー |
|---|---|
varchar(5) の列に CONCAT('abc', 'def') を INSERT |
ERROR 1406 (22001): Data too long for column 's' at row 1 |
照合順序の違う文字列を結合(utf8mb4_0900_ai_ci と latin1_swedish_ci を明示) |
ERROR 1267 (HY000): Illegal mix of collations ... for operation 'concat' |
1406 は既定の sql_mode に含まれる STRICT_TRANS_TABLES によるエラーです。列の長さを確かめるには DESCRIBE を使います(テーブル定義の確認)。照合順序は 文字コードの記事 を参照してください。
複数行の値を1つにまとめる場合は GROUP_CONCAT を使います(GROUP_CONCAT の記事)。
関連: MySQLのUPDATE / MySQLの文字コード / MySQLのERROR 1064