Việc hiển thị không đúng tiếng Việt có thể do 1 vài yếu tố. Trước mắt chúng ta làm rõ các encoding: 1- Encoding phía mysql server. Với các phiên bản mới như MySQL 5.6, 5.7 thì charset mặc định là utf8, tuy nhiên với các phiên bản cũ thì có thể được set sang Swedish (ISO-8859-1) 2- Khi gửi câu query thì encoding gì? 3- Khi nhận result về thì encoding gì? 3- Khi lấy được result, hiển thị lên web thidung encoding gì?
Trở về trường hợp của bạn,
1- Phía local, mình đoán 1 trong các encoding của bạn không phải utf8 (có thể bạn quên gọi truyền charset vào DSN, hoặc server encoding kiểu khác), thế nên khi ghi vào CSDL và view trên Navicat/hoặc view bằng mysql_client mặc định (view trên PHPMyAdmin lại khác nhé) thì bị sai encoding nên hiển thị sai mặc dù codepage ghi vào đúng. Bạn cứ tưởng tượng, bạn ghi ký tự A là codepage 100, nhưng sang encoding mới nó là lại Á. Thế nhưng khi lấy về, nó vẫn lấy đúng codepage và nếu set ở HTML charset=“utf8” thì hiển thị vẫn đúng.
Còn lần sau bạn thử với DSN có utf8, do encoding của bảng không đúng nên nó hiển thị lỗi, nhưng trả về lại là encoding utf8 nên bạn thấy đúng. Lúc này, kể cả html bạn không cần để charset=“utf8” vẫn ok.
2- Còn phía hosting, thì trường đó có thể để utf8, nhưng do bạn đẩy query lên lại không phải utf8 nên khi lưu vào db vẫn không đúng (ví dụ chữ  của ISO-8859-1, nhưng sang utf8 lại là ô. Thế nên Áo khoác bên ISO-8859-1 sang utf8 lại là Ão khoác) Khi bạn lấy về, tất nhiên codepage vẫn thế, nhưng lại tùy result set encode gì, rồi hiển thị trên HTML charset gì mà nó hiển thị không đúng (ví dụ, result vẫn là utf8 và charset html vẫn là utf8 thì hiển nhiên nó hiển thị Ão khoác rồi. Nhưng nếu bạn set charset của html là “ISO-8859-1” thì lại hiển thị đúng ^^)
Theo mình, nếu tốt nhất nên đồng bộ UTF8 ở cả 3 nơi:
1- Các table và text encoding bằng utf8 (general hay unicode cũng được, nó chỉ khác nhau về sắp xếp). Sau mình test query, làm procedure … cũng dễ dàng hơn (thậm chí sửa db bằng tay)
2- Add utf8 vào server và client command (vào DSN hoặc gọi SET NAMES utf8). Việc gọi SET NAMES utf8 sẽ tương đương với (ngoài ra có thể gọi thêm collation để làm sort) SET character_set_client = x; //query gọi lên được hiểu là encoding utf8 SET character_set_results = x; //result trả về cũng là encoding utf8 SET character_set_connection = x; // char của kết nối cũng là utf8 (hoặc SET CHARACTER SET utf8. Cái này thì nó khác ở chỗ SET collation_connection = @@collation_database;)
3-Mặc định browser cũng sẽ tự detect encoding, tuy nhiên nhiều browser cơ chế detect cũng không tốt. Do đó mình cứ set 1 cái directive charset=“utf8” cho yên tâm luôn.