2008-09-30 14 views
9

Tôi đã ngừng nghe về vấn đề này trong một vài giờ ngày hôm qua:Đang tải kết xuất mã hóa UTF-8 vào MySQL

Tôi có một cơ sở dữ liệu trên máy chủ MySQL 4.1.22 có mã hóa được đặt thành "UTF- 8 Unicode (utf8) "(như được báo cáo bởi phpMyAdmin). Các bảng trong cơ sở dữ liệu này có bộ ký tự mặc định được đặt thành latin2. Tuy nhiên, ứng dụng web (CMS Made Simple viết bằng PHP) sử dụng nó sẽ hiển thị các trang trong utf8 ...

Tuy nhiên, điều này có thể thực sự hoạt động. Ứng dụng web hiển thị các ký tự chính xác (chủ yếu là tiếng Séc và tiếng Ba Lan được sử dụng).

Tôi chạy: "mysqldump -u xxx -p -h yyy dbname> dump.sql". Điều này sẽ cho tôi một kịch bản SQL đó:

  • trông hoàn hảo trong bất kỳ trình soạn (như Notepad +) khi hiển thị trong UTF-8 - tất cả các ký tự hiển thị đúng
  • tất cả các bảng trong kịch bản có set charset mặc định để latin2
  • nó có "/ *! 40101 SET NAMES latin2 * /;" ở đầu (trong số các cài đặt khác)

Bây giờ, tôi muốn xuất cơ sở dữ liệu này sang máy chủ khác chạy trên MySQL 5.0.67, cũng với mã hóa máy chủ được đặt thành "UTF-8 Unicode (utf8)". Tôi đã sao chép toàn bộ cài đặt CMS Made Simple, sao chép kịch bản lệnh dump.sql và chạy "mysql -h ddd -u zzz -p dbname < dump.sql". Sau đó, tất cả các ký tự được tranh giành khi hiển thị các trang web CMSMS.

Tôi đã thử cài đặt:
SET character_set_client = utf8;
SET character_set_connection = latin2;

Và tất cả các kết hợp (chỉ để an toàn, ngay cả khi nó không có ý nghĩa với tôi): latin2/utf8, latin2/latin2, utf8/utf8, v.v. - không trợ giúp. Tất cả các nhân vật vẫn tranh giành, tuy nhiên đôi khi theo một cách khác :).

Tôi cũng đã thử thay thế tất cả cài đặt latin2 bằng utf8 trong tập lệnh (đặt tên và bộ ký tự mặc định cho bảng). Không có gì.

Có chuyên gia MySQL nào ở đây có thể giải thích chỉ một vài từ (tôi chắc chắn nó đơn giản sau khi tất cả) làm thế nào toàn bộ công cụ mã hóa này thực sự hoạt động? Tôi đọc 9.1.4. Connection Character Sets and Collations nhưng không tìm thấy gì hữu ích ở đó.

Cảm ơn, Matt

Trả lời

0

Ugh ... ok, dường như tôi tìm thấy một giải pháp.

MySQL không phải là thủ phạm ở đây. Tôi đã thực hiện một kết xuất đơn giản và tải ngay bây giờ, không có thay đổi nào đối với kịch bản lệnh dump.sql - nghĩa là tôi đã để lại "các tên đặt latin2" và các bảng ký tự bảng như chúng. Sau đó, tôi đã chuyển cài đặt CMSMS gốc sang cơ sở dữ liệu mới và ... nó hoạt động chính xác. Vì vậy, thực sự mã hóa trong cơ sở dữ liệu là ok, hoặc ít nhất nó hoạt động tốt với cài đặt CMSMS tôi đã có tại nhà cung cấp lưu trữ cũ của tôi (CMSMS rõ ràng does funny things with characters encoding).

Để làm cho nó hoạt động trên nhà cung cấp dịch vụ lưu trữ mới của tôi, tôi thực sự phải thêm dòng này vào lib/adodb/drivers/adodb-mysql.inc.php trong cài đặt CMSMS:

mysql_query('set names latin2',$this->_connectionID);

Đây là giải pháp sửa đổi đôi chút từ this post. Bạn cũng có thể tìm thấy đường chính xác ở đó. Vì vậy, nó trông giống như vấn đề cấu hình máy khách mysql.

28

Bạn có thử thêm --default ký tự-set = tùy chọn tên, như thế này:

mysql --default-character-set=utf8 -h ddd -u zzz -p dbname < dump.sql 

Tôi có vấn đề mà trước và nó làm việc sau khi sử dụng tùy chọn đó.

Hy vọng điều đó sẽ hữu ích!

+2

+1, thêm '--default-character- set = utf8' đã giải quyết một vấn đề tương tự cho tôi. – Jonik

+1

Tôi vừa gặp khó khăn với vấn đề này, cảm ơn rất nhiều vì giải pháp! – ZelluX

+1

thêm '--default-character-set = latin2' đã giải quyết nó cho tôi, vì tệp của tôi đã được mã hoá 'ISO-8859' –

0

GIẢI PHÁP cho tôi:

bộ tùy chọn này trong file php của bạn, sau mysql_connect (hoặc sau mysql_select_db) ..

mysql_query("SET NAMES 'utf8'");