Insert into sql bị lỗi hiển thị tiếng việt

Lỗi font tiếng Việt trong MySQL là một lỗi khá phổ biến khi nhập dữ liệu từ web và insert vào MySQL. Vậy làm thế nào để khắc phục lỗi này? Hãy cùng xem ngay hướng dẫn dưới đây nhé!

Sửa lỗi font tiếng Việt trong MySQL

Các bước sửa lỗi font tiếng Việt trong MySQL

Bước 1: Thêm lang="vi" vào trong thẻ , ví dụ:

Bước 2: Thêm thẻ trước thẻ đóng

Bước 3: Khi kết nối dữ liệu thêm câu lệnh mysqli_set_charset[$conn, 'UTF8'];

Ngoài ra, bạn kiểm tra lại Collation của Table hoặc Database có phải là utf8_* hay chưa? ví dụ: utf8_general_ci.

Code đầy đủ:


// Create connection
$conn = mysqli_connect[$servername, $username, $password, $database];
mysqli_set_charset[$conn, 'UTF8'];
// Check connection
if [$conn === false] {
    die["ERROR: Không thể kết nối. " . mysqli_connect_error[]];
}

Lời kết

Trên đây là toàn bộ hướng dẫn sửa lỗi font tiếng Việt trong MySQL. Chúc các bạn thành công và có một ngày làm việc thật hiệu quả. Xin chào và hẹn gặp lại!

Hôm nay có ông anh nhờ kiểm tra giúp vì cần xuất data từ hệ thống quản lý đơn hàng cũ sang Google Sheets, sử dụng App Scripts để truy cập database sau đó lấy dữ liệu insert ra google sheets, nhưng gặp phải lỗi sai kí tự tiếng Việt.

Bên Website vẫn hiện đúng, nhưng trong data hiển thị sai ví dụ:

  • Chuyên mục sản phẩm “Bánh Nướng 4 Trứng” sẽ hiển thị là Bánh NÆ°á»›ng 4 Trứng

Sau khi kiểm tra thì thấy bên trong DB đã lưu sai như vậy chứ ko phải do cách insert phía google scripts, tìm hiểu tham khảo thấy bài viết giải thích về vấn đề này khá chi tiết trên StackOverFlow.

  • //stackoverflow.com/questions/38363566/trouble-with-utf-8-characters-what-i-see-is-not-what-i-stored

Như vậy chính xác vấn đề chúng ta cần giải quyết là trường hợp được gọi là Mojibake. Có từ khoá rồi, google sẽ ra cách fix phần data, nhưng để giải quyết triệt để thì cần fix 2 điểm:

1/ Sửa lỗi data hiện có

  • Kiểm tra lại Character Set & Collation của các table / column bị lỗi. Chuyển thành utf8 – utf8_unicode_ci hoặc utf8mb4 – utf8mb4_general_ci / utf8mb4_unicode_ci
  • Chạy MySQL Query để update lại data đã sai: [Thay table_name và column_name tương ứng]

    UPDATE table_name SET column_name = CONVERT[BINARY CONVERT[column_name USING latin1] USING utf8];

    • [Lệnh tham khảo fix tại //stackoverflow.com/questions/1476356/detecting-utf8-broken-characters-in-mysql]
    • Thành quả sau khi chạy lệnh, hú hồn!

2/ Sửa lỗi lưu từ phía code để data mới ko sai nữa

Cái này tuỳ vào source code tuy nhiên theo mình các framework mới, thông thường sẽ ko bị, source web cũ của ông anh dùng PHP5 và là code tự viết nên sẽ có nhiều khả năng, và trong trường hợp này là khai báo sai khi query MySQL, lỗi cũng khá phổ biến, nhưng cũng hơi khó nhận ra.

  • Lệnh sai: mysql_query[$this->conn,”SET NAMES ‘UTF-8‘”];
  • Lệnh đúng: mysql_query[$this->conn,”SET NAMES ‘UTF8‘”];

Test lại thêm dòng sản phẩm mới thấy dòng dữ liệu mới lưu đúng là tiếng Việt thì boom! Vậy là ổn rồi.

Để lọc được đúng giá trị có dấu tiếng Việt Unicode trong câu lệnh WHERE, ta sẽ bổ sung chữ N trước giá trị của điều kiện cần so sánh. Việc chúng ta cho thêm chữ N phía trước để báo cho SQL Server biết là chúng ta đang làm việc với chuỗi ký tự dạng Unicode.

SELECT * FROM TEN_DATABASE.dbo.TEN_BANG

WHERE DIEU_KIEN = N‘GIÁ TRỊ CÓ DẤU TIẾNG VIỆT’

–HOẶC

SELECT * FROM TEN_DATABASE.dbo.TEN_BANG

WHERE DIEU_KIEN IN [ N’GIÁ TRỊ CÓ DẤU TIẾNG VIỆT 1′, N’GIÁ TRỊ CÓ DẤU TIẾNG VIỆT 2′, N’GIÁ TRỊ CÓ DẤU TIẾNG VIỆT 3′]

Hoặc hiển thị giá trị của cột trong câu lệnh SELECT

SELECT ‘HỌC SQL THẬT LÀ THÚ VỊ’ AS TEN_COT

SELECT N’HỌC SQL THẬT LÀ THÚ VỊ’ AS TEN_COT

Việc chúng ta cho thêm chữ N phía trước để báo cho SQL Server biết là chúng ta đang làm việc với chuỗi ký tự dạng Unicode [N là viết tắt của National language character]. Viết N có nghĩa là chúng ta đang truyền vào giá trị dạng Nchar, nvarchar hoặc ntext, thay vì truyền vào dạng Char, varchar, và text như mặc định của SQL Server.

Theo giải thích của Microsoft như sau:

Prefix Unicode character string constants with the letter N. Without the N prefix, the string is converted to the default code page of the database. This default code page may not recognize certain characters.

Tiền tố N thể hiện chuỗi ký tự dạng Unicode. Không có tiền tố N, chuỗi được chuyển đổi sang trang mã mặc định của cơ sở dữ liệu. Trang mã mặc định này có thể không nhận ra các ký tự nhất định.

Chủ Đề