スマイリーフェイスをMySQLに挿入する方法(()


18

私はMySQL 5.5.21を使用しており、「\ xF0 \ x9F \ x98 \ x8A」のスマイリーフェイス文字を挿入しようとしています。しかし、私の人生では、どうすればいいのかわかりません。

私が読んでいるさまざまなフォーラムによると、それは可能です。しかし、私がそれを試みるたびに、データは切り捨てられます。

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)

しかし、私のテーブル定義は次のとおりです。

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を使用していることがわかります。確かにこれはマルチバイト文字の使用に関する問題を修正しますか?

OK、だから気づかなかった:

  `content` text CHARACTER SET utf8 NOT NULL,

今は修正しましたが、ファンキーな結果が得られます。

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

現在、アプリケーション層のすべての特殊文字を消去しているので、それほど問題にはなりません。しかし、どうにかしてMySQLにデータを出し入れすることが可能かどうか知りたいです。
ブライアンハント

ないMySQLの男が、あなたは指定することはできませんuft8のためのTEXTフィールドだけでなく
JNK

セット名utf8mb4を実行しましたか?挿入を発行する前にクライアントから?
atxdba

JNK、テキストフィールドはテーブルのデフォルト(この場合はutf8mb4)を使用しています。
ブライアンハント

atxdba。提案のおかげで、まだ?として出てきますが、これはおそらく破損を意味します。それらの顔文字/ディセプティコンをくそー!;)
ブライアンハント

回答:


22

1
その仕事を辞めたので、テスト/検証できません。しかし、collat​​ion-server = utf8mb4_unicode_ci設定が欠落していたと思われます。良いチュートリアル!
ブライアンハント

とてもいいマティアス。人々へのリマインダー、クライアント接続の詳細が重要です。mysqlNodeからNPMモジュールを使用charset: 'utf8mb4'しているので、createConnection()呼び出しで指定する必要があります。そうしないIncorrect string valueと、テーブルと列をutf8mb4文字セットと照合に変換した後でも、エラーでUTF8文字を挿入できませんでした。ステップ5のクライアント構成レベルの詳細が同様の効果をもたらすと期待しています。
ニーク

2

次のことを行います。

  1. データベースの文字セットをutf8mb4に設定します

  2. 列の文字セットをutf8mb4に設定します

以下のクエリのように:

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

これらの手順は本当に十分ですか?受け入れられた答えにはもっとたくさんあります。
コリン 'tハート

問題が何であったかによりますが、問題がデータベース側にあった場合、これで十分です。しかし、それはクライアント接続の問題でもあります。
スパイドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.