Gülen yüzleri MySQL'e nasıl ekleyebilirim (😊)


18

MySQL 5.5.21 kullanıyorum ve '\ xF0 \ x9F \ x98 \ x8A' gülen yüz karakterini eklemeye çalışıyorum. Ama hayatım boyunca, nasıl yapılacağını anlayamıyorum.

Okuduğum çeşitli forumlara göre bu mümkün. Ama ne zaman denersem, veri kesilir.

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)

Ancak tablo tanımım aşağıdaki gibidir.

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 

CHARSET = utf8mb4 kullandığımı görebilirsiniz. Şüphesiz bu, çok baytlı karakterlerin kullanımıyla ilgili sorunları düzeltir mi?

Tamam, bu yüzden fark etmedim:

  `content` text CHARACTER SET utf8 NOT NULL,

Bunu şimdi düzelttim, ama yine de korkak sonuçlar elde ediyorum.

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 |
 +--------+-------+-----------------------+

Şimdi uygulama katmanındaki tüm özel karakterleri yok ediyorum, bu yüzden benim için çok fazla sorun değil. Ancak, verileri bir şekilde MySQL'e girip çıkarmanın mümkün olup olmadığını bilmek istiyorum.
Bryan Hunt

Bir MySQL adamı değil, aynı uft8zamanda TEXTalan için de belirleyemezsiniz
JNK

set isimlerini çalıştırdınız mı? eklemeden önce müşterinizden?
atxdba

JNK, metin alanı varsayılan tablo, bu durumda utf8mb4 kullanıyor.
Bryan Hunt

atxdba. Öneri için teşekkürler, hala? Gibi çıkıyor, muhtemelen bozuk demektir. Bu ifadeleri / decepticonları lanetleyin! ;)
Bryan Hunt

Yanıtlar:


22

Geçenlerde yazdım MySQL en geçiş hakkında ayrıntılı bir rehber utf8içinutf8mb4 . Oradaki adımları izlerseniz, her şey doğru şekilde çalışmalıdır. İşte sürecin her bir adımına doğrudan bağlantılar:

Sorununuzun 5. adımı izleyerek çözülebileceğinden şüpheleniyorum. Umarım bu yardımcı olur!


1
Bu işi bırakıp test / doğrulama yapamadık. Ancak collation-server = utf8mb4_unicode_ci ayarının ne eksik olduğundan şüpheleniyorum. İyi öğretici!
Bryan Hunt

Çok hoş Mathias. İnsanlara bir hatırlatma, müşteri bağlantı bilgileriniz önemlidir. Ben NPM modülü kullanıyorum mysqlDüğümden ve belirtmek için gereken charset: 'utf8mb4'benim de createConnection()aksi hala başarısız gerçek UTF8 karakterleri ekleyerek, çağrı Incorrect string valuebile tabloyu ve sütun değiştirdikten sonra, hatanın utf8mb4karakter seti ve harmanlama. Adım 5'te istemcinizin yapılandırma düzeyi ayrıntılarının da benzer bir etkisi olacağını umuyorum.
Neek

2

Aşağıdakileri yapın:

  1. Veritabanı karakter kümesini utf8mb4 olarak ayarlayın

  2. Sütun karakter kümesini utf8mb4 olarak ayarlayın

aşağıdaki sorgu gibi:

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

Bu adımlar gerçekten yeterli mi? Kabul edilen cevabın çok daha fazlası var.
Colin 't Hart

Sorunun ne olduğuna bağlı olarak, sorun veritabanı tarafındaysa bu yeterlidir. Ancak bir istemci bağlantı sorunu da çok iyi olabilir.
spydon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.