Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Sử dụng đúng phân tách dòng mới (Newline) trong GROUP_CONCAT MySQL

Mặc định GROUP_CONCAT dùng dấu phẩy ',' làm phân tách. Để dùng ký tự xuống dòng (\n hoặc \r\n), phải chỉ định rõ trong mệnh đề SEPARATOR và lưu ý về escape chuỗi trong MySQL.

Tạo bảng và dữ liệu

mysql> CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstName VARCHAR(20),
    LastName VARCHAR(20)
);

mysql> INSERT INTO DemoTable (FirstName, LastName) VALUES
('John', 'Smith'), ('David', 'Miller'), ('John', 'Doe');

Dữ liệu

mysql> SELECT * FROM DemoTable;
+----+-----------+----------+
| Id | FirstName | LastName |
+----+-----------+----------+
|  1 | John      | Smith    |
|  2 | David     | Miller   |
|  3 | John      | Doe      |
+----+-----------+----------+

Cú pháp đúng: SEPARATOR với chuỗi literal chứa escape

Trong MySQL, chuỗi literal trong ngoặc đơn '...' hoặc kép "..." hỗ trợ escape backslash. Để dùng \r\n (CRLF) hoặc \n (LF):

mysql> SELECT GROUP_CONCAT(
    CONCAT_WS(' ', FirstName, LastName) 
    SEPARATOR '\r\n'
) FROM DemoTable;

Kết quả (hiển thị trên một dòng nhưng chứa ký tự xuống dòng thực tế)

+-------------------------------------------------------------------+
| GROUP_CONCAT(CONCAT_WS(' ', FirstName, LastName) SEPARATOR "\r\n") |
+-------------------------------------------------------------------+
| John Smith
David Miller
John Doe                                                            |
+-------------------------------------------------------------------+

Giải thích

  • CONCAT_WS(' ', FirstName, LastName): Nối FirstName + ' ' + LastName (WS = With Separator). Tự động bỏ qua NULL.
  • SEPARATOR '\r\n': Phân tách các giá trị nối bởi CRLF (Windows newline). Dùng '\n' cho Linux/Unix.
  • Kết quả hiển thị trong client MySQL có thể không ngắt dòng trực quan, nhưng dữ liệu thực có ký tự \r\n. Xuất ra file hoặc ứng dụng sẽ thấy đúng dòng mới.

Lưu ý quan trọng

  • Nếu dùng SEPARATOR '\\n' (double backslash) -> lưu trữ literal backslash + n, không phải newline.
  • group_concat_max_len mặc định 1024 byte. Dữ liệu lớn -> tăng: SET SESSION group_concat_max_len = 1000000;.
  • GROUP_CONCAT trả về VARBINARY / TEXT / BLOB tùy kiểu dữ liệu đầu vào và độ dài.