web-dev-qa-db-ja.com

不正な文字列値: '\ xF0 \ x9F \ x8E \ xB6 \ xF0 \ x9F ...' MySQL

MYSQLテーブルにツイートを保存しようとしています。 Tweet は次のとおりです。

quiero que me escuches、no te burles no te rias、anoche tuve unsueñoque te fuiste de mi vida????????

最後の2文字は両方とも 'MULTIPLE MUSICAL NOTES'(U + 1F3B6) で、UTF-8エンコーディングは0xf09f8eb6です。

テーブルのTweet_textフィールドはutf8mb4でエンコードされています。しかし、その列にツイートを保存しようとすると、次のエラーメッセージが表示されます。

誤った文字列値:行1の列「Tweet_text」の「\ xF0\x9F\x8E\xB6\xF0\x9F ...」.

何が悪いのでしょうか?どうすれば修正できますか?複数の言語も保存する必要があり、この文字セットはすべての言語で機能しますが、絵文字や絵文字などの特殊文字では機能しません。

これは私のcreate tableステートメントです:

CREATE TABLE `Twitter_status_data` (
  `unique_status_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `metadata_result_type` text CHARACTER SET utf8,
  `created_at` text CHARACTER SET utf8 NOT NULL COMMENT 'UTC time when this Tweet was    created.',
  `id` bigint(20) unsigned NOT NULL COMMENT 'Unique Tweet identifier',
  `id_str` text CHARACTER SET utf8 NOT NULL,
  `Tweet_text` text COMMENT 'Actual UTF-8 text',
  `user_id_str` text CHARACTER SET utf8,
  `user_name` text COMMENT 'User''s name',
  `user_screen_name` text COMMENT 'Twitter handle',
  `coordinates` text CHARACTER SET utf8,
  PRIMARY KEY (`unique_status_id`),
  KEY `user_id_index` (`user_id`),
  FULLTEXT KEY `Tweet_text_index` (`Tweet_text`)
) ENGINE=InnoDB AUTO_INCREMENT=82451 DEFAULT CHARSET=utf8mb4;
46
db1

私はついに問題を理解することができました。 mysql構成my.iniのいくつかの設定を変更する必要がありました。この記事は非常に役立ちました http://mathiasbynens.be/notes/mysql-utf8mb4#character-sets

最初にmy.iniの文字セットをutf8mb4に変更し、次にmysqlクライアントで次のコマンドを実行しました

SET NAMES utf8mb4; 
ALTER DATABASE dreams_Twitter CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

次のコマンドを使用して、変更が行われたことを確認します

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
87
db1

私は同じ問題にぶつかり、次のことを学びました。

データベースにはutf-8のデフォルトの文字セットがありますが、MySQLではデータベースの列が異なる文字セットを持つ可能性があります。 dBと問題のある列をUTF-8に変更しました。

mysql> ALTER DATABASE MyDB CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'

mysql> ALTER TABLE database.table MODIFY COLUMN column_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

次に、新しいテーブルを作成します:

> CREATE TABLE My_Table_Name (
    Twitter_id_str VARCHAR(255) NOT NULL UNIQUE,
    Twitter_screen_name VARCHAR(512) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
    .....
  ) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
12
Vishal

明らかかもしれませんが、SET NAMES utf8utf8mb4エンコーディングと互換性がないことは、私にとってまだ驚きでした。そのため、一部のアプリでは、テーブル/列のエンコーディングを変更するだけでは不十分でした。アプリの構成でエンコードを変更する必要がありました。

Redmine(Ruby、ROR)

config/database.yml

production:
  adapter: mysql2
  database: redmine
  Host: localhost
  username: redmine
  password: passowrd
  encoding: utf8mb4

カスタムYiiアプリケーション(PHP)

config/db.php

return [
    'class' => yii\db\Connection::class,
    'dsn' => 'mysql:Host=localhost;dbname=yii',
    'username' => 'yii',
    'password' => 'password',
    'charset' => 'utf8mb4',
],

カラム/テーブルエンコーディングとしてutf8mb4があり、それでもこのようなエラーが発生する場合は、アプリケーションでDB接続の正しい文字セットを設定していることを確認してください。

5
rob006

Create tableステートメントによると、テーブルのデフォルトの文字セットはすでにutf8mb4です。接続文字セットが間違っているようです。

Javaでは、データソースURLをjdbc:mysql://127.0.0.1:3306/testdb?useUnicode = true&characterEncoding = utf-8のように設定します。

utf8mb4を使用するには、「?useUnicode = true&characterEncoding = utf-8」が必要です。

それは私のアプリケーションで動作します。

3
Shine Huang

SQLALCHEMYおよびPYTHONの場合

Unicodeに使用されるエンコーディングは、伝統的に「utf8」でした。ただし、MySQLバージョン5.5.3以降では、新しいMySQL固有のエンコーディング「utf8mb4」が導入され、MySQL 8.0では、サーバー側のディレクティブ内でプレーンutf8が指定され、 utf8mb3。この新しいエンコーディングの理論的根拠は、MySQLのレガシーutf-8エンコーディングが4バイトではなく最大3バイトのコードポイントのみをサポートするという事実によるものです。したがって、サイズが3バイトを超えるコードポイントを含むMySQLデータベースと通信する場合、データベースとクライアントDBAPIの両方でサポートされている場合、次のようにこの新しい文字セットが優先されます。

e = create_engine(
    "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4")
All modern DBAPIs should support the utf8mb4 charset.

ここにリンクの説明を入力

0
Nick Po