09/10/2018, 23:21

Muôn thuở vẫn là bó tay với tiếng Việt (trong MySQL)

Xin chào các bạn,

Mình rất lấy làm điên đầu và phải nói là chào thua khi vấn đề này nó vẫn cứ đeo đẳng chúng ta những người mà có trang web chạy trên nền Apache + MySQL + PHP.

Chúng ta thử cùng nhau đi tìm lời giải cho rốt ráo vấn đề này đi xem thử có thành công.

Đây là hoàn cảnh mà vấn đề nảy sinh:

1) Trang web hiển thị tiếng Việt không đúng dù đã chỉnh đủ kiểu encoding.

2) Nhập dữ liệu với phpMyAdmin bằng tiếng Việt có dấu với charset là UTF-8 hoặc Unicode, dùng đúng bộ gõ ở mã Unicode thì sau đó vẫn ra giun dế không đọc được.

3) Rắc rối giữa các phiên bản MySQL 3.23.xx, 4.0.xx, 4.1.xx, 5.xx.xx và vân vân... các kiểu charset, collation,...

4) Nhập tiếng Việt tốt, hiển thị tiếng Việt tốt nhưng khi backup lại và phục hồi lại dữ liệu từ file .sql (hoặc dạng nén .zip / Gzip của nó) thì ...ôi thôi : Chúa ơi, cứu con với!

5) Vấn đề có lẽ không do trình duyệt, không phải bởi font chữ, cũng chẳng phải PHP hay MySQL gì cả. Phải chăng server không hỗ trợ?!

6) Dường như các hàm của PHP xử lý chuỗi theo kiểu Byte nên tiếng Việt có dấu là không thể? (Ví dụ: Trường em thì không phải có độ dài là 9 ký tự mà nó là số cần phải lập hàm để tính, cũng khá rắc rối đây. Ký tự nào tiếng Việt chiếm 2byte, ký tự nào 1byte đây. Vất vả quá đi mất.

Mong rằng các bạn cùng thảo luận để chúng ta có thể đưa ra một vài hàm hoặc class để có thể áp dụng xử lý chuỗi để không còn phải đối đầu với vấn đề tiếng Việt giun dế nữa. Được như vậy thì với một vài phiên bản PHP + MySQL + Apache thông dụng mà các host hay chạy chúng ta có thể áp dụng "bộ công cụ" chúng ta có để hạn chế cảnh dở khóc dở cười khi sao lưu => phục hồi, di chuyển thì host này sang host khác, bị lỗi các ký từ à...

Nếu cực đoan quá mức có lẽ sử dụng hàm loại bỏ tất cả dấu tiếng Việt đi cho đỡ rắc rối nhỉ?

Chúng ta cùng trao đổi với nhau, những ai có chút kinh nghiệm về việc này chia sẻ cùng anh em với nào.
superthinb viết 01:37 ngày 10/10/2018
Có đúng là các anh em webmaster ở đây bó tay không đấy? Hay là quí vị định giấu nghề nhỉ? Hãy cùng thảo luận xem thế nào? Rất nhiều người chiến đấu với PHP, MySQL qua các phần mềm script dạng này mà chưa từng đụng phải vấn đề lỗi font sao?

Hy vọng mọi người thảo luận và cho biết kinh nghiệm giải quyết là gì?

Việc sao lưu, phục hồi database nên dùng công cụ nào là tốt nhất? Trường hợp nào làm thế nào?

Hiện nay mình rất sợ trường hợp sao lưu DB ngon lành đến khi trên mạng bị làm sao đó, phục hồi lại thì ôi thôi, toàn là mì gói vỡ vụn không làm sao cứu được. Ngồi cả mấy ngày đánh vật với cái file .sql đã sao lưu về tìm cách chuyển đổi nó thì cũng không thành công, chỗ nào có chữ à, ữ gì đó thì ra dấu ? hết trơn, nếu chỉ có duy nhất một chữ ra dấu ? thì tìm kiếm thay thế được, còn nó nhiều hơn 1 thì thua rồi.

Các bạn cùng thảo luận để giải quyết nhé, vấn đề này có từ 2001 đến nay vẫn chưa giải quyết xong thì không ổn, không bình thường tí nào.
terafunny viết 01:29 ngày 10/10/2018
Bạn chưa nắm vững cách sao lưu và phục hồi dữ liệu cho đúng charset, nên làm nhiều thì sẽ quen.

Hàm tiếng Viết thì trên mạng có hàm thế này:

PHP Code:
function unicode_strlen($s) {
        
$c preg_match_all ('/./u'$s$m);
        return (
$c);
}

echo 
unicode_strlen('Trường em'); #=> 9 
Tôi nhớ không lầm thì mấy cái này giải quyết lâu rồi, chắc bạn ngủ đông từ 2001 đến nay!
thienthan36 viết 01:33 ngày 10/10/2018
dùng UTF8 hay mã latin trong MySQL
trình duyệt dùng mã latin : WINDOWS-1259 hay gì đó
sử dụng hàm htmlspecialchar() để chuyển đổi qua lại giữ mã unicode và mã html, như vậy là trinh bày được thôi mà.
Còn server MYSQL thì có lúc nó chạy kô tốt với Unicode việt nam.
Muốn an toàn thì dùm mã unicode của HTML.
mr47 viết 01:30 ngày 10/10/2018
Tất cả mọi thứ, từ MySQL, cho đến charset trên template của bạn phải là utf-8. Nếu có phải đụng đến Editor nào thì chỉnh cho nó thành Unicode luôn!
Nói chung, nguyên tắc là phải đồng bộ về charset.
thienthan36 viết 01:22 ngày 10/10/2018
Vấn đề ở đây là MYSQL có lúc làm việc không ổn định với UNICODE UTF-8. tuy bạn đã đồng bộ các charset nhưng khi backup hay restore lỗi mã ngay.
mr47 viết 01:29 ngày 10/10/2018
Đó là lỗi khi bạn back-up, không phải của MySQL.
Bài liên quan
0