2016-02-01 21 views
41

Tôi cố gắng lưu tên từ người dùng từ một dịch vụ trong cơ sở dữ liệu MySQL của tôi. Những tên này có thể chứa các biểu tượng cảm xúc như (chỉ dành cho các ví dụ)MySQL utf8mb4, Lỗi khi lưu biểu tượng cảm xúc

Sau khi tìm kiếm một chút, tôi đã tìm thấy số này stackoverflow liên kết đến số tutorial này. Tôi làm theo các bước và có vẻ như mọi thứ đều được cấu hình đúng cách.

Tôi có Cơ sở dữ liệu (bộ ký tự và tập hợp được đặt thành utf8mb4 (_unicode_ci)), một Bảng có tên TestTable, cũng được định cấu hình theo cách này, cũng như cột "Văn bản" được định cấu hình theo cách này (VARCHAR (191) utf8mb4_unicode_ci).

Khi tôi cố gắng tiết kiệm biểu tượng cảm xúc tôi nhận được một lỗi:

Example of error for shortcake(): 
    Warning: #1300 Invalid utf8 character string: 'F09F8D' 
    Warning: #1366 Incorrect string value: '\xF0\x9F\x8D\xB0' for column 'Text' at row 1 

Các chỉ Emoji mà tôi đã có thể tiết kiệm đúng cách được mặt trời ☀️

Mặc dù tôi đã không cố gắng tất cả trong số họ một cách trung thực.

Có điều gì tôi thiếu trong cấu hình không?

Xin lưu ý: Tất cả các thử nghiệm tiết kiệm không liên quan đến phía khách hàng. Tôi sử dụng phpmyadmin để tự thay đổi các giá trị và lưu dữ liệu. Vì vậy, cấu hình thích hợp của phía máy khách là một cái gì đó mà tôi sẽ chăm sóc sau khi máy chủ lưu các biểu tượng cảm xúc đúng cách.

Sidenote Một: Hiện nay, khi lưu biểu tượng cảm xúc tôi hoặc là nhận được lỗi như trên, hoặc không nhận được báo lỗi và các dữ liệu của Username sẽ được lưu trữ như Username ????. Lỗi hoặc không có lỗi phụ thuộc vào cách tôi lưu. Khi tạo/lưu thông qua câu lệnh SQL tôi lưu với dấu chấm hỏi, khi chỉnh sửa nội tuyến tôi lưu với dấu hỏi, khi chỉnh sửa bằng cách sử dụng nút chỉnh sửa, tôi nhận được lỗi.

cảm ơn bạn

EDIT 1: Được rồi vì vậy tôi nghĩ tôi phát hiện ra vấn đề, nhưng không phải là giải pháp. Dường như các biến cụ thể của Cơ sở dữ liệu không thay đổi đúng cách.

Khi tôi đăng nhập bằng root trên máy chủ của tôi và đọc ra các biến (toàn cầu):
Query sử dụng: SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

+--------------------------+--------------------+ 
| Variable_name   | Value    | 
+--------------------------+--------------------+ 
| character_set_client  | utf8mb4   | 
| character_set_connection | utf8mb4   | 
| character_set_database | utf8mb4   | 
| character_set_filesystem | binary    | 
| character_set_results | utf8mb4   | 
| character_set_server  | utf8mb4   | 
| character_set_system  | utf8    | 
| collation_connection  | utf8mb4_unicode_ci | 
| collation_database  | utf8mb4_unicode_ci | 
| collation_server   | utf8mb4_unicode_ci | 
+--------------------------+--------------------+ 
10 rows in set (0.00 sec) 

Đối với cơ sở dữ liệu của tôi (trong phpmyadmin, cùng một truy vấn) có vẻ như sau:

+--------------------------+--------------------+ 
| Variable_name   | Value    | 
+--------------------------+--------------------+ 
| character_set_client  | utf8    | 
| character_set_connection | utf8mb4   | 
| character_set_database | utf8mb4   | 
| character_set_filesystem | binary    | 
| character_set_results | utf8    | 
| character_set_server  | utf8    | 
| character_set_system  | utf8    | 
| collation_connection  | utf8mb4_unicode_ci | 
| collation_database  | utf8mb4_unicode_ci | 
| collation_server   | utf8mb4_unicode_ci | 
+--------------------------+--------------------+ 

Làm cách nào để điều chỉnh các cài đặt này trên cơ sở dữ liệu cụ thể? Ngoài ra, mặc dù tôi có cài đặt hiển thị đầu tiên làm mặc định, khi tạo cơ sở dữ liệu mới, tôi sẽ nhận được cài đặt thứ hai làm cài đặt.

** Edit 2: ""

Đây là my.cnf tập tin của tôi:

[client] 
port=3306 
socket=/var/run/mysqld/mysqld.sock 
default-character-set = utf8mb4 

[mysql] 
default-character-set = utf8mb4 

[mysqld_safe] 
socket=/var/run/mysqld/mysqld.sock 

[mysqld] 
user=mysql 
pid-file=/var/run/mysqld/mysqld.pid 
socket=/var/run/mysqld/mysqld.sock 
port=3306 
basedir=/usr 
datadir=/var/lib/mysql 
tmpdir=/tmp 
lc-messages-dir=/usr/share/mysql 
log_error=/var/log/mysql/error.log 
max_connections=200 
max_user_connections=30 
wait_timeout=30 
interactive_timeout=50 
long_query_time=5 
innodb_file_per_table 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 

!includedir /etc/mysql/conf.d/ 
+1

đó là sự cố phpmyadmin, hãy thử ứng dụng khách mysql khác. – jsxqf

+2

Tôi không nghĩ đó là vấn đề về phpmyadmin. Như bạn có thể thấy trong Edit1, tôi nghĩ rằng đó là một số cấu hình sai giữa các biến/tham số conf/mặc định và các biến trên cơ sở dữ liệu. Mặc dù khi tạo cơ sở dữ liệu mới. – Loki

+0

'$ cfg [" DefaultCharset "]' trong cấu hình PMA của bạn là gì? – miken32

Trả lời

37

character_set_client, _connection, và _results phải tất cả được utf8mb4 cho shortcake đó là ăn được.

Một điều gì đó, ở đâu đó, đang thiết lập một tập con của những cá nhân đó. Rummage thông qua my.cnf và phpmyadmin của cài đặt - một cái gì đó không phải là thiết lập cả ba.

Nếu SET NAMES utf8mb4 được thực thi, cả ba được đặt chính xác.

Mặt trời chiếu sáng vì chỉ có 3 byte - E2 98 80; utf8 là đủ cho mã hóa utf8 3 byte của các ký tự Unicode.

+0

Được rồi, tôi nghĩ điều này khiến tôi gần gũi hơn. Cảm ơn bạn. Tôi đã chỉnh sửa câu hỏi của mình và thêm my.cnf. Có lẽ bạn có thể thấy một cái gì đó trong đó? – Loki

+1

Kết nối cần phải có 'utf8mb4'. Nếu bạn không thể tìm thấy nơi để làm điều đó, sau đó thực hiện 'SET NAMES utf8mb4'. –

+0

Đây là một lời giải thích tốt đẹp về những gì cũng đã đi sai. Nhưng ngoài ra tôi phải kiểm tra phiên và các biến toàn cầu. Nhận thấy các biến Session của PHPMyadmins vẫn sai và lỗi chỉ xảy ra đối với bảng quản trị. – Loki

3

Có thể dịch vụ/ứng dụng của bạn đang kết nối với "utf8" thay vì "utf8mb4" cho bộ ký tự của ứng dụng khách. Điều đó tùy thuộc vào ứng dụng khách.

Đối với một ứng dụng PHP thấy http://php.net/manual/en/function.mysql-set-charset.php hoặc http://php.net/manual/en/mysqli.set-charset.php

Đối với một ứng dụng Python thấy https://github.com/PyMySQL/PyMySQL#example hoặc http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#mysql-unicode

Ngoài ra, kiểm tra xem các cột của bạn thực sự là utf8mb4. Một cách trực tiếp là như sau:

mysql> SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_name = "user" AND column_name = "displayname"; 
+--------------------+ 
| character_set_name | 
+--------------------+ 
| utf8mb4   | 
+--------------------+ 
1 row in set (0.00 sec) 
4

Đối với tôi, hóa ra vấn đề nằm trong ứng dụng mysql.

cập nhật máy khách mysql my.cnf cài đặt char trên máy chủ và dẫn đến cài đặt ký tự không mong muốn.

Vì vậy, những gì tôi cần làm là chỉ cần thêm character-set-client-handshake = FALSE. Nó vô hiệu hóa cài đặt máy khách từ làm phiền cài đặt char của tôi.

my.cnf sẽ như thế này.

[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
... 

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

Các vấn đề liên quan