Подтвердить что ты не робот

Неверное строковое значение: '\ xF0\x9F\x8E\xB6\xF0\x9F...' MySQL

Я пытаюсь сохранить твит в моей таблице MYSQL. твит:

quiero que me escuches, no te burles no te rias, anoche tuve un sueño que te fuiste de mi vida 🎶🎶

Последние два символа являются "МНОГОЯЗЫЧНЫЕ МУЗЫКАЛЬНЫЕ ПРИМЕЧАНИЯ" (U + 1F3B6), для которых кодировка UTF-8 0xf09f8eb6.

Поле tweet_text в моей таблице закодировано в utf8mb4. Но когда я пытаюсь сохранить твит в этом столбце, я получаю следующее сообщение об ошибке:

Неверное строковое значение: '\ xF0\x9F\x8E\xB6\xF0\x9F...' для столбца 'tweet_text' в строке 1.

Что происходит не так? Как я могу это исправить? Мне нужно также хранить несколько языков, и этот набор символов работает для всех языков, но не для специальных символов, таких как смайлики и эможи.

Это мой оператор 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' 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;
4b9b3361

Ответ 1

Наконец-то я смог выяснить эту проблему. Мне пришлось изменить некоторые настройки в конфигурации 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%';

Ответ 2

Я столкнулся с той же проблемой и узнал следующее -

Несмотря на то, что база данных имеет набор символов utf-8 по умолчанию, возможно, для столбцов базы данных может быть установлен другой набор символов в MySQL. Измененный дБ и проблемный столбец для 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;

Ответ 3

Это может быть очевидно, но мне все еще было удивительно, что SET NAMES utf8 не совместима с кодировкой utf8mb4. Поэтому для некоторых приложений изменение кодировки таблицы/столбца было недостаточно. Мне пришлось изменить кодировку в конфигурации приложения.

Redmine (рубин, 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 в качестве кодировки столбца/таблицы и по-прежнему получаете подобные ошибки, убедитесь, что в вашем приложении настроена правильная кодировка для соединения с БД.

Ответ 4

Согласно оператору create table кодировка таблицы по умолчанию уже utf8mb4. Похоже, у вас неправильная кодировка соединения.

В Java установите URL источника данных следующим образом: jdbc: mysql://127.0.0.1: 3306/testdb? UseUnicode = true & characterEncoding = utf-8.

"? useUnicode = true & characterEncoding = utf-8" необходимо для использования utf8mb4.

Это работает для моего приложения.