Bagaimana saya bisa memasukkan wajah smiley ke MySQL (😊)

18

Saya menggunakan MySQL 5.5.21, dan mencoba memasukkan karakter wajah smiley '\ xF0 \ x9F \ x98 \ x8A'. Tetapi untuk kehidupan saya, saya tidak tahu bagaimana melakukannya.

Menurut berbagai forum yang telah saya baca, itu mungkin. Tetapi setiap kali saya mencobanya, data akan terpotong.

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)

Tapi definisi tabel saya adalah sebagai berikut.

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 

Orang dapat melihat bahwa saya menggunakan CHARSET = utf8mb4. Tentunya ini mengoreksi masalah seputar penggunaan karakter multi-byte?

Ok, jadi saya tidak memperhatikan:

  `content` text CHARACTER SET utf8 NOT NULL,

Saya sudah memperbaikinya sekarang, tetapi masih mendapatkan hasil yang funky.

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 |
 +--------+-------+-----------------------+
Bryan Hunt
sumber
Saya menghapus semua karakter khusus di lapisan aplikasi sekarang, jadi itu tidak terlalu menjadi masalah bagi saya. Tapi, saya ingin tahu apakah mungkin entah bagaimana mendapatkan data masuk dan keluar dari MySQL.
Bryan Hunt
Bukan orang MySQL, tetapi tidak bisa Anda tentukan uft8untuk TEXTbidang juga
JNK
Anda telah menjalankan nama yang ditetapkan utf8mb4; dari klien Anda sebelum mengeluarkan sisipan?
atxdba
JNK, bidang teks menggunakan tabel default, dalam hal ini utf8mb4.
Bryan Hunt
atxdba. Terima kasih atas sarannya, masih keluar sebagai ?, yang mungkin berarti rusak. Sialan emoticon / decepticons itu! ;)
Bryan Hunt

Jawaban:

22

Saya baru-baru ini menulis panduan terperinci tentang cara beralih dari MySQL utf8keutf8mb4 . Jika Anda mengikuti langkah-langkah di sana, semuanya akan berfungsi dengan benar. Berikut adalah tautan langsung ke setiap langkah individu dalam proses:

Saya menduga bahwa masalah Anda dapat diselesaikan dengan mengikuti langkah 5. Semoga ini bisa membantu!

Mathias Bynens
sumber
1
Telah meninggalkan pekerjaan itu sehingga tidak dapat menguji / memverifikasi. Namun saya menduga bahwa pengaturan collation-server = utf8mb4_unicode_ci adalah apa yang hilang. Tutorial yang bagus!
Bryan Hunt
Mathias yang sangat bagus. Pengingat kepada orang-orang, detail koneksi klien Anda penting. Saya menggunakan modul NPM mysqldari Node, dan perlu menentukan charset: 'utf8mb4'dalam createConnection()panggilan saya , jika tidak memasukkan karakter UTF8 yang benar masih gagal dengan Incorrect string valuekesalahan, bahkan setelah mengonversi tabel dan kolom ke utf8mb4kumpulan dan susunan karakter. Saya berharap detail tingkat konfigurasi klien Anda di Langkah 5 akan memiliki efek yang sama.
Neek
2

Lakukan hal-hal berikut:

  1. Set basis data charset ke utf8mb4

  2. Atur charset kolom ke utf8mb4

seperti permintaan di bawah ini:

ALTER TABLE `comments` CHANGE `text` `text` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
Poonam Gupta
sumber
Apakah langkah-langkah ini cukup memadai? Jawaban yang diterima memiliki lebih banyak.
Colin 't Hart
Bergantung pada apa masalahnya, jika masalahnya ada di sisi database, ini sudah cukup. Tapi itu bisa menjadi masalah koneksi klien juga.
spydon