Đi tới các diễn đàn liên quan tới IT thường gặp những câu hỏi đại loại như:
- Mysql database migration and special characters
- Dữ liệu UTF-8 và chuyển đổi máy chủ MySQL
- Khi em export database từ MySQL5.x (Home) sau đó restore vào MySQL 4.x thì font chữ hiển thị không đúng, bác nào bít giúp em với.
- Vẫn là vấn đề lỗi phông Tiếng Việt với MysQl 5x
- Lỗi phông chữ hiển thị do trình duyệt hay Mysql
Hầu hết các vấn đề bên trên có thể giải quyết triệt để bằng cách thay đổi 2 thiết định cho MySQL. Đó là default-character-set và skip-character-set-client-handshake
Trước hết về vấn đề lưu trữ dữ liệu tiếng Việt trong MySQL, điều kiện tiên quyết là dữ liệu phải được lưu với bảng mã (character-set) là utf8. Thực hiện truy vấn sau để kiểm tra bảng mã hiện tại của MySQL.
Kết quả trên cho thấy MySQL sử dụng utf8 cho system còn lại tất cả đều là latin1. Điều này gây ra mâu thuẫn giữa việc tiếng Việt vẫn được hiển thị đúng (trên browser, qua PHP) mặc dù database ở dạng latin1. Nguyên nhân ở đây chính là tính năng mặc định của MySQL khi tự động hoán chuyển latin1 <-> utf8 mỗi lần có kết nối từ client (PHP v.v).
Nhiều người thực hiện câu truy vấn SET NAMES để giải quyết vấn đề hiển thị tiếng Việt, tuy nhiên thường không đạt được kết quả như mong muốn. Cụ thể ra sao?
Kết quả trên cho thấy truy vấn SET NAMES chỉ có hiệu lực với client, connection, và results. Đối với server và database (database hiện tại cũng như các tables với dữ liệu tiếng Việt đã có sẵn trong database đó) thì truy vấn SET NAMES không có hiệu lực. Điều này có thể hiểu được bởi rõ ràng là MySQL server không thể nghe theo MySQL client (PHP v.v) để thay đổi bảng mã của tất cả các dữ liệu có sẵn (mỗi khi có kết nối).
Cách giải quyết triệt để như sau:
1) Chuyển đổi toàn bộ các database (tables) hiện có sang CHARSET utf8
2) Thay đổi thiết định của MySQL sao cho bảng mã mặc định là utf8 và MySQL không tự động hoán chuyển bảng mã.
Cách làm cụ thể như sau: (a)~(f)
(a) Dùng lệnh mysqldump để dump toàn bộ các tables ra file. Ví dụ sau sẽ dump các tables của database mydb ra file mydb.sql (có thể đạt được mục đích tương tự với phpMyAdmin etc). Lặp lại bước này với tất cả các database khác nếu cần thiết.
(b) Trong file vừa dump, chuyển CHARSET=latin1 thành CHARSET=utf8.
- Trên Windows, có thể dùng bất cứ text editor nào có thể soạn thảo được tiếng Việt mã utf8 (ví dụ EmEditor), find and replace, save.
- Trên Linux/Unix thì chỉ việc thực hiện lệnh sau:
(c) Dump tất cả các databases cần thiết thành files xong, bước kế tiếp là thay đổi thiết định và khởi động lại MySQL. Thêm 2 dòng sau vào ngay bên dưới dòng [mysqld] trong file my.cnf:
Dòng 1 set bảng mã mặc định của MySQL thành utf8, dòng 2 set cho MySQL không tự động hoán chuyển bảng mã.
(d) Thay đổi thiết định xong, khởi động lại MySQL.
(e) Login vào MySQL vừa khởi động lại và tạo một database mới (ví dụ newdb). Lặp lại bước này đối với các databases khác, không quên set permission cho đúng.
(f) Logout khỏi MySQL rồi import files vừa soạn ở bước (b) vào trong database mới
Bước (f) trên đây kết thúc việc utf8-hóa các cơ sở dữ liệu dạng latin1. Các bước trên hoàn toàn có thể áp dụng cho quá trình chuyển hoặc nâng cấp MySQL (ví dụ từ MySQL 4.x.x lên 5.x.x). Chúc thành công!
- Mysql database migration and special characters
- Dữ liệu UTF-8 và chuyển đổi máy chủ MySQL
- Khi em export database từ MySQL5.x (Home) sau đó restore vào MySQL 4.x thì font chữ hiển thị không đúng, bác nào bít giúp em với.
- Vẫn là vấn đề lỗi phông Tiếng Việt với MysQl 5x
- Lỗi phông chữ hiển thị do trình duyệt hay Mysql
Hầu hết các vấn đề bên trên có thể giải quyết triệt để bằng cách thay đổi 2 thiết định cho MySQL. Đó là default-character-set và skip-character-set-client-handshake
Trước hết về vấn đề lưu trữ dữ liệu tiếng Việt trong MySQL, điều kiện tiên quyết là dữ liệu phải được lưu với bảng mã (character-set) là utf8. Thực hiện truy vấn sau để kiểm tra bảng mã hiện tại của MySQL.
mysql> show variables like char%;
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Kết quả trên cho thấy MySQL sử dụng utf8 cho system còn lại tất cả đều là latin1. Điều này gây ra mâu thuẫn giữa việc tiếng Việt vẫn được hiển thị đúng (trên browser, qua PHP) mặc dù database ở dạng latin1. Nguyên nhân ở đây chính là tính năng mặc định của MySQL khi tự động hoán chuyển latin1 <-> utf8 mỗi lần có kết nối từ client (PHP v.v).
Nhiều người thực hiện câu truy vấn SET NAMES để giải quyết vấn đề hiển thị tiếng Việt, tuy nhiên thường không đạt được kết quả như mong muốn. Cụ thể ra sao?
mysql> set names utf8;
mysql> show variables like char%;
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Kết quả trên cho thấy truy vấn SET NAMES chỉ có hiệu lực với client, connection, và results. Đối với server và database (database hiện tại cũng như các tables với dữ liệu tiếng Việt đã có sẵn trong database đó) thì truy vấn SET NAMES không có hiệu lực. Điều này có thể hiểu được bởi rõ ràng là MySQL server không thể nghe theo MySQL client (PHP v.v) để thay đổi bảng mã của tất cả các dữ liệu có sẵn (mỗi khi có kết nối).
Cách giải quyết triệt để như sau:
1) Chuyển đổi toàn bộ các database (tables) hiện có sang CHARSET utf8
2) Thay đổi thiết định của MySQL sao cho bảng mã mặc định là utf8 và MySQL không tự động hoán chuyển bảng mã.
Cách làm cụ thể như sau: (a)~(f)
(a) Dùng lệnh mysqldump để dump toàn bộ các tables ra file. Ví dụ sau sẽ dump các tables của database mydb ra file mydb.sql (có thể đạt được mục đích tương tự với phpMyAdmin etc). Lặp lại bước này với tất cả các database khác nếu cần thiết.
$ mysqldump -u mysql_username -p --default-character-set=latin1 mydb > mydb.sql
(b) Trong file vừa dump, chuyển CHARSET=latin1 thành CHARSET=utf8.
- Trên Windows, có thể dùng bất cứ text editor nào có thể soạn thảo được tiếng Việt mã utf8 (ví dụ EmEditor), find and replace, save.
- Trên Linux/Unix thì chỉ việc thực hiện lệnh sau:
$ sed -i s/CHARSET=latin1/CHARSET=utf8/g mydb.sql(c) Dump tất cả các databases cần thiết thành files xong, bước kế tiếp là thay đổi thiết định và khởi động lại MySQL. Thêm 2 dòng sau vào ngay bên dưới dòng [mysqld] trong file my.cnf:
default-character-set=utf8
skip-character-set-client-handshake
Dòng 1 set bảng mã mặc định của MySQL thành utf8, dòng 2 set cho MySQL không tự động hoán chuyển bảng mã.
(d) Thay đổi thiết định xong, khởi động lại MySQL.
(e) Login vào MySQL vừa khởi động lại và tạo một database mới (ví dụ newdb). Lặp lại bước này đối với các databases khác, không quên set permission cho đúng.
mysql> create database newdb;
mysql> grant all privileges on newdb.* to mysql_username@localhost identified by .....
(f) Logout khỏi MySQL rồi import files vừa soạn ở bước (b) vào trong database mới
$ mysql -u mysql_username -p newdb < mydb.sql
Bước (f) trên đây kết thúc việc utf8-hóa các cơ sở dữ liệu dạng latin1. Các bước trên hoàn toàn có thể áp dụng cho quá trình chuyển hoặc nâng cấp MySQL (ví dụ từ MySQL 4.x.x lên 5.x.x). Chúc thành công!
Votes:25
Average:8.80
|
Programming/Database |
Tính toán với các số lớn vô hạn bằng thư viện GMP |


