Jun
22

Sử dụng unicode cho mysql với CakePHP

Author admin    Category Kinh nghiệm     Tags , ,

Ngày xửa ngày xưa, bà con chúng ta thường hay dùng collation cho mysql là latin1 (cả table và field), dữ liệu lưu trong mysql nếu dùng phpmyadmin để xem thì hệt như chữ của dân tộc nào đó ngoài hành tinh! Ấy thế mà lại hay, dữ liệu vô tình được mã hóa!

Nói cho vui vậy thôi, đúng là dữ liệu nhìn từ phpmyadmin chả hiểu nó là gì nhưng chỉ cần code một đoạn php nho nhỏ cho lên trình duyệt là thấy thôi mà!

Ban đầu, khi xây dựng một ứng dụng cho một công ty nọ, tôi cũng nhắm mắt dùng latin1, sau một thời gian hoàn thành và vận hành, phát sinh một số yêu cầu mới cần phải có sự can thiệp của win form, C# là ngôn ngữ tôi chọn để dùng! Thế là bắt tay vào code, kết nối mysql, hiển thị dữ liệu lên form và…toàn là giun với dế, thế là toi mạng, không tài nào làm cho chú C# hiểu và hiển thị dữ liệu dạng lantin thành unicode. Sau một thời gian đắn đo, quyết định phải làm lại db cho ứng dụng, chuyển tất cả table và field từ lantin sang utf8_general_ci. Nghe có vẻ khó khăn nhưng chỉ cần chịu khó ngồi code một đoạn php thôi thì chuyện này không đến nỗi nào, dữ liệu cũ đương nhiên cũng phải convert lại!

Mọi chuyện đã rõ ràng, cần phải dùng collation là utf8 cho các table và fields trong mysql để nó có thể lưu trữ tiếng Việt có dấu mà không bị “biến dạng”. C# dĩ nhiên đọc và ghi dữ liệu vào rất tốt!

Sau khi convert xong database, chạy lại ứng dụng, 2 phút sau nhận được một chân lý: C# có thể đọc và ghi dữ liệu với dạng unicode tuyệt vời nhưng dữ liệu thêm từ form trên web (ứng dụng web code trên nền CakePHP), khi vào database nó vẫn là những ký tự lằng ngoằng không thể đọc nổi. Table và Field đều đã có collation là utf8 rồi mà, vậy lí do ở đâu?

Vật lộn một lúc thì tìm ra nguyên nhân: thì ra connection cũng có encoding, nghĩa là khi tạo kết nối tới mysql, có một tham số để xác định encoding cho kết nối đó!

Vậy vấn đề tiếp theo là tìm xem chỉnh cái encoding ở đâu trong CakePHP bây giờ. Lục trong app/config/database.php, mừng quá, thấy rồi:

* encoding =>
 * For MySQL, MySQLi, Postgres and DB2, specifies the character encoding to use when connecting to the
 * database.  Defaults to 'UTF-8' for DB2.  Uses database default for all others.
 *
 */

thế là chỉnh lại thông số kết nối như sau:

var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'root',
		'password' => '',
		'database' => 'test_cake',
		'prefix' => '',
		'encoding' => 'utf8'
	);

Kể dài dòng thế thôi, bạn chỉ cần chú ý ở đoạn: ‘encoding’ => ‘utf8′, mặc định trong mảng kết nối của CakePHP không có element này!

Và kết luận lại: dữ liệu được thêm với kiểu kết nối nào thì chỉ hiển thị đúng khi dùng kiểu kết nối đó để truy vấn nó

Hình dưới là những record minh họa cho kết luận ở trên, 2 dòng đầu thêm vào với encoding của connection là utf8, select lên dùng latin, 2 dòng cuối thêm vào với encoding là latin, select lên cũng là latin

5 Comments to “Sử dụng unicode cho mysql với CakePHP”

  • Bảo Nam 28/09/2010 at 7:46 pm

    Hiện tại mình đang tiếp nhận lại server từ một người khác,
    Với server cũ, mình chạy web thì hiển thị tiếng Việt bình thường,
    Nhưng khi mình setup apache, php mới, rồi kết nối với database cũ thì bị lỗi font

    Chữ dưới db: “bảng báo cáo tiến độ và khối lượng tháng 6″, khi server cũ (apache, php đã được người đi trước cài) chạy web thì không bị lỗi font. Nhưng cùng với source code đó, mình copy qua server mới mình tự setup thì web bị lỗi font “?i h?n kh�ng qu� m??i ng�y l�m vi?c, k? t? ng�y n”

    Mình không hiểu lý do tại sao, mình đã thử test bằng cách copy toàn bộ thư mục cài đặt apache và php qua server mới thì chạy ko bị lỗi nữa. Bạn có kinh nghiệm vê vấn đề này không, giúp mình với. Cám ơn rất nhiều.

    P/s: bạn có thể tạo chức năng send mail mỗi khi có ai đó trả lời comment bài viết được không, khi đó mình có thể theo dõi qua mail để biết bạn khi nào trả lời mình. Thanks.

  • admin 06/10/2010 at 2:19 pm

    Vậy bạn chuyển dữ liệu từ server cũ sang server mới bằng cách nào? Lúc import dữ liệu vào, thao tác chọn collation rất quan trọng!

    Cám ơn bạn đã nhắc, mình có cấu hình gởi email khi có comment, chắc tại host nó khóa hàm mail lại rồi, để mình kiếm cái plugin smtp gắn vô xem sao

  • Bảo Nam 10/05/2011 at 4:46 pm

    Mình đã biết được lỗi là do đâu rồi, vào xóa tất cả các file cache trong thư mục tmp/cache/ là được :D .

  • Lê dịu 11/08/2011 at 5:01 pm

    Admin ơi!
    giúp em với em thường viết về C# nhưng đi làm thì công ty viết toàn về Cakephp.Giờ em muốn học thêm cakephp nhưng em không biết lên bắt đầu từ tuy. Giúp em với.
    Em cảm ơn Admin

  • admin 04/09/2011 at 6:40 pm

    Nếu viết C# giờ chuyển sang CakePHP thì bạn phải học về ngôn ngữ PHP trước. CakePHP chỉ là framework viết bằng ngôn ngữ PHP, hỗ trợ phát triển nhanh các ứng dụng mà thôi!

Post comment

Follow us on Twitter! Follow us on Twitter!
Diễn đàn CakePHP cho người Việt Nam

Bài viết mới

Thảo luận mới

TAG

Calendar

June 2010
M T W T F S S
    Jul »
 123456
78910111213
14151617181920
21222324252627
282930  

Lưu trữ

Blogroll

Thống kê

5 khách