Sử dụng unicode cho mysql với CakePHP
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”
Post comment
Bài viết mới
- CakePHP version 1.3.12
- Tạo chuỗi ngẫu nhiên với 1 dòng code
- Kỹ thuật “bit field” trong phân quyền
- Làm việc với File và Folder
- CakePHP 1.3.8
- CakePHP 1.3.7 Released
- Ajax trong CakePHP
- Tạo và load file config trong CakePHP
- Làm site đa ngôn ngữ với CakePHP (Phần 1)
- CakePHP 1.3.6 and 1.2.9 released
- CakePHP 1.3.5 released
- Type hinting trong PHP
- CakePHP ra phiên bản mới 1.3.4
- Tích hợp Zend framework vào CakePHP
- Tạo virtual host trên local
- Sử dụng Acl trong cakephp – Phần 2
- Sử dụng Acl trong cakephp – Phần 1
- Sinh code tự động với cake console
- Tự động xóa record ở bảng con khi reocord ở bảng cha bị xóa
- Xác thực người dùng với component Auth
Thảo luận mới
- admin on Sử dụng session trong CakePHP
- admin on Sử dụng session trong CakePHP
- hanh on Sử dụng session trong CakePHP
- bich yen on Sử dụng session trong CakePHP
- admin on Sử dụng session trong CakePHP
- bich yen on Sử dụng session trong CakePHP
- bich yen on Sử dụng session trong CakePHP
- admin on Sử dụng Acl trong cakephp – Phần 1
- admin on Sử dụng session trong CakePHP
- Bich Yen on Sử dụng session trong CakePHP
TAG
Calendar
Lưu trữ
- September 2011 (3)
- July 2011 (1)
- March 2011 (1)
- February 2011 (1)
- November 2010 (4)
- October 2010 (1)
- September 2010 (2)
- August 2010 (9)
- July 2010 (9)
- June 2010 (22)
Blogroll
- Bakery
- Biển đảo Việt Nam
- CakePHP
- CakePHP Google Group
- CakePHP Manual
- CakePHP Questions
- Diễn đàn CakePHP VN

admin


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.
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
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
.
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
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!