2012-02-28 28 views
9

Tôi đã đặt mọi biến tập mã hóa mà tôi có thể tìm ra là utf8.Đường ray hiển thị dấu chấm hỏi (????) cho dữ liệu utf8 đầu vào của tôi

Trong database.yml:

development: &development 
    adapter: mysql2 
    encoding: utf8 

Trong my.cnf:

[client] 
default-character-set = utf8 

[mysqld] 
default-character-set = utf8 
skip-character-set-client-handshake 
character-set-server = utf8 
collation-server = utf8_general_ci 
init-connect = SET NAMES utf8 

Và nếu tôi chạy client mysql trong terminal:

mysql> show variables like 'character%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | utf8      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

mysql> show variables like 'collation%'; 
+----------------------+-----------------+ 
| Variable_name  | Value   | 
+----------------------+-----------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | utf8_general_ci | 
| collation_server  | utf8_general_ci | 
+----------------------+-----------------+ 

Nhưng nó để đánh bại không khí. Khi tôi chèn utf8 dữ liệu từ ứng dụng Rails, cuối cùng nó sẽ trở thành ?????????????

Tôi bỏ lỡ điều gì?

+0

Xem http://stackoverflow.com/questions/29805029/stored-non-english-characters-got-mysql-character-set-issue/29810725# 29810725 để thảo luận về các dấu hỏi và cách xử lý chúng. –

Trả lời

15

Không kiểm tra cài đặt chung nhưng khi bạn được kết nối với cơ sở dữ liệu cụ thể cho ứng dụng. Khi bạn thay đổi cài đặt cho mysql, bạn cũng đã thay đổi cài đặt cho cơ sở dữ liệu ứng dụng của mình.

Cách đơn giản để kiểm tra xem nó là để đăng nhập vào mysql vào ứng dụng db:

mysql app_db_production -u db_user -p 

hoặc đường ray lệnh:

rails dbconsole production 

Đối với ứng dụng của tôi nó trông như thế này:

mysql> show variables like 'character%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | utf8      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.00 sec) 

mysql> show variables like 'collation%'; 
+----------------------+-------------------+ 
| Variable_name  | Value    | 
+----------------------+-------------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | latin1_swedish_ci | 
| collation_server  | utf8_general_ci | 
+----------------------+-------------------+ 
3 rows in set (0.00 sec) 

Lệnh thay đổi đối chiếu và sắp xếp cơ sở dữ liệu:

mysql> alter database app_db_production CHARACTER SET utf8 COLLATE utf8_general_ci ; 
Query OK, 1 row affected (0.00 sec) 

Và hãy nhớ thay đổi charset và collation cho tất cả các bảng của bạn:

ALTER TABLE tablename CHARACTER SET utf8 COLLATE utf8_general_ci; # changes for new records 
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; # migrates old records 

Bây giờ nó phải làm việc.

+1

Có thể muốn sử dụng utf_unicode_ci thay vì utf_general_ci. http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci – mahemoff

+0

Tôi đã tạo một GIST mà tôi đã sử dụng để tạo SQL để di chuyển ứng dụng đường ray có vấn đề này - mặc dù nhỏ, nó được thiết kế đẹp mắt: https://gist.github.com/richhollis/7153490 –

0

Bạn có điều này trong HTML không?

<meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 

hoặc trên các trang HTML5 với <!doctype html>

<meta charset="utf-8"> 

Bạn có thể cần điều này để cho các trình duyệt gửi chuỗi trong utf8.

+0

Có lẽ tốt để có anyway, nhưng hãy ghi nhớ nó sẽ không giúp bạn nhiều nếu dữ liệu được lưu trữ là "????" trong cơ sở dữ liệu rồi. –

0

Tôi có một số vấn đề ngay hôm nay! Nó được giải quyết bằng cách thả bảng của tôi và tạo mới, sau đó db: di chuyển và tất cả là khá hoạt động!
CẢNH BÁO: CNTT sẽ xóa tất cả dữ liệu trong bảng NÀY
Vì vậy:
$ mysql -u USER -p
mysql > drop database YOURDB_NAME_development;
mysql > create database YOURDB_NAME_development CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql > \q
$ rake db:migrate
Well done!

+0

TABLE kế thừa từ DATABASE. COLUMN kế thừa từ TABLE. Vì vậy, nếu bạn có sự xa xỉ của việc bỏ cơ sở dữ liệu, mã này rất đơn giản và hiệu quả. –

1

Okay cho bất cứ ai cho ai câu trả lời @Ravbaker không cắt nó .. một số lời khuyên hơn

MySQL có mã hóa quy định tại nhiều cấp độ: máy chủ, cơ sở dữ liệu, kết nối, bảng và thậm chí cả lĩnh vực/cột. Vấn đề của tôi là lĩnh vực/cột đã buộc phải latin (mà trên cưỡi tất cả các mã hóa khác).Tôi thiết lập các lĩnh vực trở lại bảng mã hóa (được utf-8) và thế giới là tốt một lần nữa.

Hầu hết các cài đặt này có thể được đặt ở các vị trí thông thường: my.cnf, thay đổi truy vấn và tệp cơ sở dữ liệu đường ray.yml.

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8; 

là truy vấn đã thực hiện thủ thuật cho tôi.

Đối với mã hóa máy chủ/kết nối sử dụng my.cnf và database.yml Đối với cơ sở dữ liệu/bảng/mã hóa cột sử dụng truy vấn

(Bạn cũng có thể đạt được những bằng phương tiện khác)

+0

Hãy thận trọng ... 'ALTER ... MODIFY' và' ALTER ... CONVERT TO' làm những việc khác nhau. Nếu văn bản duy nhất bạn có là ascii, hoặc là sẽ làm. Nếu bạn hiện có các byte latin1 chính xác trong cột, bạn cần 'CHUYỂN ĐỔI TO' để thay đổi byte. –

3

tôi đã cùng một vấn đề . Tôi thêm characterEncoding đến hết chuỗi kết nối mysql:

use this: jdbc:mysql://localhost/dbname?characterEncoding=utf8 
instead of this: jdbc:mysql://localhost/dbname 
Các vấn đề liên quan