MySQL 7 min read

MySQLの文字列結合 ― CONCATがNULLになる・||が0を返すとき

※この記事にはアフィリエイト広告(プロモーション)が含まれます。

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

MySQL をもっと深く知るための本

MySQL徹底入門 第5版 MySQL 8.4 LTS対応

翔泳社・2025年6月・MySQL 8.4 LTS 対応

MySQL 8.4 に対応した入門書。日本MySQLユーザ会のメンバーが執筆している。

Amazonで見る

MySQL運用・管理[実践]入門 〜安全かつ高速にデータを扱う内部構造・動作原理を学ぶ

技術評論社・2024年5月

内部構造と動作原理から、運用・管理の考え方を学ぶ。

Amazonで見る

Amazonのアソシエイトとして、FIRE SE は適格販売により収入を得ています。