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;
私はついに問題を理解することができました。 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%';
私は同じ問題にぶつかり、次のことを学びました。
データベースには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;
明らかかもしれませんが、SET NAMES utf8
がutf8mb4
エンコーディングと互換性がないことは、私にとってまだ驚きでした。そのため、一部のアプリでは、テーブル/列のエンコーディングを変更するだけでは不十分でした。アプリの構成でエンコードを変更する必要がありました。
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接続の正しい文字セットを設定していることを確認してください。
Create tableステートメントによると、テーブルのデフォルトの文字セットはすでにutf8mb4です。接続文字セットが間違っているようです。
Javaでは、データソースURLをjdbc:mysql://127.0.0.1:3306/testdb?useUnicode = true&characterEncoding = utf-8のように設定します。
utf8mb4を使用するには、「?useUnicode = true&characterEncoding = utf-8」が必要です。
それは私のアプリケーションで動作します。
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.