Làm cách nào tôi có thể chèn khuôn mặt cười vào MySQL ()


18

Tôi đang dùng MySQL 5.5.21 và đang cố gắng chèn ký tự mặt cười '\ xF0 \ x9F \ x98 \ x8A'. Nhưng đối với cuộc sống của tôi, tôi không thể tìm ra cách để làm điều đó.

Theo các diễn đàn khác nhau mà tôi đã đọc, điều đó là có thể. Nhưng bất cứ khi nào tôi thử nó, dữ liệu sẽ bị cắt ngắn.

mysql> INSERT INTO hour  (  `title`,   `content`,   `guid` ,  `published` , `lang` ,  `type` ,  
       `indegree` ,  `lon` ,  `lat` ,  `state` ,  `country` , `hour`  )   
       VALUES ( "title" ,  "content 😊  content" ,  "guid" ,  1,  1,   
                     "WEBLOG",  1,  1,  1,  "state" ,  "country" ,  1 );
Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------+
| Level   | Code | Message                                                                       |
+---------+------+-------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A  ...' for column 'content' at row 1 |
| Warning | 1265 | Data truncated for column 'published' at row 1                                |
+---------+------+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|           687302 |
+------------------+
1 row in set (0.00 sec)

mysql> select * from hour where id = 687302;
+--------+-------+----------+------+---------------------+
| id     | title | content  | guid | published           |
+--------+-------+----------+------+---------------------+
| 687302 | title | content  | guid | 0000-00-00 00:00:00 |
+--------+-------+----------+------+---------------------+
1 row in set (0.00 sec)

Nhưng định nghĩa bảng của tôi là như sau.

CREATE TABLE `hour` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  `content` text CHARACTER SET utf8 NOT NULL,
  `guid` varchar(255) CHARACTER SET utf8 NOT NULL,
  `published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lang` tinyint(3) unsigned NOT NULL,
  `type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
  `indegree` int(4) unsigned NOT NULL,
  `lon` float DEFAULT NULL,
  `lat` float DEFAULT NULL,
  `state` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `country` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `hour` int(2) DEFAULT NULL,
  `gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
  `time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687560 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288 

Mọi người có thể thấy rằng tôi đang sử dụng CHARSET = utf8mb4. Chắc chắn điều này sửa các vấn đề xung quanh việc sử dụng các ký tự nhiều byte?

Ok, vì vậy tôi đã không thông báo:

  `content` text CHARACTER SET utf8 NOT NULL,

Tôi đã sửa nó ngay bây giờ, nhưng vẫn nhận được kết quả sôi nổi.

CREATE TABLE `hourtmp` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  `content` text NOT NULL,
  `guid` varchar(255) CHARACTER SET utf8 NOT NULL,
  `published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lang` tinyint(3) unsigned NOT NULL,
  `type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
  `indegree` int(4) unsigned NOT NULL,
  `lon` float DEFAULT NULL,
  `lat` float DEFAULT NULL,
  `state` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `country` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `hour` int(2) DEFAULT NULL,
  `gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
  `time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687563 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288 |

 mysql> INSERT INTO hourtmp  (  `title`,   `content`,   `guid` ,  `published` , `lang` ,  `type` ,  `indegree` ,  
 `lon` ,  `lat` ,  `state` ,  `country` , `hour`  )   VALUES ( "title" ,  "content 😊  content" ,  
 "guid" ,  1,  1,   "WEBLOG",  1,  1,  1,  "state" ,  "country" ,  1 );
 Query OK, 1 row affected, 2 warnings (0.00 sec)

 mysql> show warnings;

 | Level   | Code | Message                                                                       |

 | Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A  ...' for column 'content' at row 1 |
 | Warning | 1265 | Data truncated for column 'published' at row 1                                |

 2 rows in set (0.00 sec)

 mysql> select * from hourtmp;
 +--------+-------+-----------------------+
 | id     | title | content               |
 +--------+-------+-----------------------+
 | 687560 | title | content ????  content |
 | 687561 | title | content ????  content |
 +--------+-------+-----------------------+

Bây giờ tôi đang xóa sạch tất cả các ký tự đặc biệt trong lớp ứng dụng, vì vậy nó không phải là vấn đề quá lớn đối với tôi. Nhưng, tôi muốn biết liệu bằng cách nào đó có thể lấy dữ liệu vào và ra khỏi MySQL.
Bryan Hunt

Không phải là một anh chàng MySQL, nhưng bạn cũng không thể chỉ định uft8cho TEXTlĩnh vực này
JNK

bạn đã chạy đặt tên utf8mb4; từ khách hàng của bạn trước khi phát hành chèn?
atxdba

JNK, trường văn bản đang sử dụng mặc định bảng, trong trường hợp này là utf8mb4.
Bryan Hunt

atxdba. Cảm ơn cho lời đề nghị, vẫn đi ra như?, Có lẽ có nghĩa là bị hỏng. Chết tiệt những biểu tượng cảm xúc / decepticons! ;)
Bryan Hunt

Câu trả lời:


22

Gần đây tôi đã viết một hướng dẫn chi tiết về cách chuyển từ MySQL utf8sangutf8mb4 . Nếu bạn làm theo các bước ở đó, mọi thứ sẽ hoạt động chính xác. Dưới đây là các liên kết trực tiếp đến từng bước riêng lẻ trong quy trình:

Tôi nghi ngờ rằng vấn đề của bạn có thể được giải quyết bằng cách làm theo bước 5. Hy vọng điều này sẽ giúp!


1
Đã bỏ công việc đó nên không thể kiểm tra / xác minh. Tuy nhiên, tôi nghi ngờ rằng cài đặt collation-server = utf8mb4_unicode_ci là thiếu. Hướng dẫn tốt!
Bryan Hunt

Mathias rất hay. Một lời nhắc nhở cho mọi người, chi tiết kết nối khách hàng của bạn có vấn đề. Tôi đang sử dụng mô-đun NPM mysqltừ Node và cần chỉ định charset: 'utf8mb4'trong createConnection()cuộc gọi của mình , nếu không, việc chèn các ký tự UTF8 thực sự vẫn không thành công với Incorrect string valuelỗi, ngay cả sau khi chuyển đổi bảng và cột utf8mb4thành bộ ký tự và đối chiếu. Tôi hy vọng chi tiết mức cấu hình máy khách của bạn trong Bước 5 sẽ có hiệu quả tương tự.
Neek

2

Làm những việc sau:

  1. Đặt bộ ký tự cơ sở dữ liệu thành utf8mb4

  2. Đặt charset của cột để utf8mb4

như truy vấn dưới đây:

ALTER TABLE `comments` CHANGE `text` `text` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

Những bước này có thực sự đủ? Câu trả lời được chấp nhận có nhiều hơn nữa.
Colin 't Hart

Phụ thuộc vào vấn đề là gì, nếu vấn đề nằm ở phía cơ sở dữ liệu thì điều này là đủ. Nhưng nó cũng rất có thể là một vấn đề kết nối máy khách.
spydon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.