Неверное строковое значение: '\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 `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;

person db1    schedule 05.12.2013    source источник
comment
Вы установили набор символов для подключения к базе данных на utf8mb4?   -  person eggyal    schedule 06.12.2013
comment
Извините, что вы подразумеваете под набором символов подключения к базе данных? Набор символов базы данных — utf8mb4, а сопоставление — utf8mb4_general_ci.   -  person db1    schedule 06.12.2013
comment
Я получаю похожее сообщение об ошибке и для этого твита twitter.com/OfficialMansi/status/406007380241969152 В конце твита есть смайлик. Сообщение об ошибке: Неверное строковое значение: '\xF3\xBE\x8D\x83 h...' для столбца 'tweet_text' в строке 1.   -  person db1    schedule 06.12.2013
comment
dev.mysql.com/doc/en/charset-connection.html   -  person eggyal    schedule 06.12.2013
comment
Если больше ничего не работает, не могли бы вы просто опубликовать оператор «создать таблицу» для этой таблицы?   -  person Danack    schedule 06.12.2013
comment
Я добавил оператор создания таблицы к исходному вопросу выше. Интересно, почему он не показывает набор символов поля tweet_text как utf8mb4. Он показывает, что на клиенте mysql, который я использую   -  person db1    schedule 06.12.2013
comment
База данных подключение. Для старого API mysql: mysql_set_charset('utf8mb4'). Для более новых API это зависит от API.   -  person deceze♦    schedule 06.12.2013
comment
возможный дубликат Использование utf8mb4 с php и mysql   -  person deceze♦    schedule 06.12.2013
comment
Когда я запускаю этот запрос в mysql, он показывает мне набор символов для поля tweet_text как utf8mb4 SELECT character_set_name FROM information_schema.COLUMNS C WHERE table_schema = dream_twitter AND table_name = twitter_status_data AND column_name = tweet_text;   -  person db1    schedule 06.12.2013
comment
Не кодировка столбца, а кодировка соединения! Когда вы подключаетесь к базе данных, есть кодировка соединения, которая сообщает базе данных, какую кодировку вы будет отправлять данные и какую кодировку вы ожидаете обратно. Как именно вы подключаетесь к базе данных?   -  person deceze♦    schedule 06.12.2013
comment
Я использую этот оператор, чтобы установить кодировку соединения в utf8mb4 после подключения к базе данных: mysql_set_charset($con,'utf8mb4');   -  person db1    schedule 06.12.2013
comment
Я использую этот оператор, чтобы установить кодировку соединения в utf8mb4 после подключения к базе данных: mysqli_set_charset($con,'utf8mb4');   -  person db1    schedule 06.12.2013
comment
@deceze › кодировка соединения! Спасибо, deceze, ты мой спаситель!   -  person kgf3JfUtW    schedule 27.10.2018


Ответы (7)


Наконец-то я смог разобраться в проблеме. Мне пришлось изменить некоторые настройки в конфигурации 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%';
person db1    schedule 06.12.2013
comment
Примечание: если вы используете node npm sequenceize + MySQL, вам нужно установить кодировку особым образом, который показался мне причудливым, по крайней мере, мне. github.com/sequelize/sequelize/issues/395 - person treejanitor; 16.06.2016
comment
о Боже, :) большое спасибо db1. примерно через 12 часов сделал с вашим советом. Я только что выполнил набор имен utf8mb4 в момент создания соединения в коде, после чего все прошло правильно. - person Amin Heydari Alashti; 19.07.2018
comment
я выполнил SET NAMES utf8mb4; запрос перед моей вставкой, но теперь я не могу получить новый идентификатор вставки из подготовленного оператора. пожалуйста, предложите мне решение для этого - person Onkar Musale; 29.05.2019
comment
Я сделал скрипт, который автоматически преобразует все таблицы в базу данных gist.github.com/pobegov/f8b293fb6eb658a13feb1c318e6c07ed - person clops; 04.07.2019
comment
Просто добавим аргументацию: в MySQL UTF-8 может содержать только 3 байта на символ. Кодировка MySQL utf8mb4 на самом деле является настоящей 4-байтовой кодировкой utf8. - person Pankaj; 27.12.2019

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

Несмотря на то, что база данных имеет набор символов по умолчанию 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;
person Vishal    schedule 06.12.2013

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

Redmine (ruby, ROR)

In config/database.yml:

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

Пользовательское приложение Yii (PHP)

In config/db.php:

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

Если у вас есть utf8mb4 в качестве кодировки столбца/таблицы и все еще возникают подобные ошибки, убедитесь, что вы настроили правильную кодировку для подключения к БД в своем приложении.

person rob006    schedule 12.07.2018
comment
Redmine — некорректно работало, когда конфигурация применялась к уже существующей БД, поэтому вот код миграции, чтобы исправить это redmine.org /вопросы/21398 - person Ashen One; 03.04.2020

Изменить кодировку и сопоставление базы данных

ALTER DATABASE
    database_name
    CHARACTER SET = utf8mb4
    COLLATE = utf8mb4_unicode_ci;

изменить кодировку и сопоставление конкретной таблицы

ALTER TABLE
    table_name
    CONVERT TO CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

изменить кодировку соединения в драйвере mysql

до

charset=utf8&parseTime=True&loc=Local

после

charset=utf8mb4&collation=utf8mb4_unicode_ci&parseTime=True&loc=Local

Из этой статьи https://hackernoon.com/today-i-learned-storing-emoji-to-mysql-with-golang-204a093454b7

person Giang    schedule 11.12.2019

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

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

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

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

person Shine Huang    schedule 13.12.2018
comment
это работает! в зависимости от клиента (например, некоторые клиенты понимают utf-8, а некоторые просто понимают utf8, в моем случае использование utf8mb4 для набора символов работает). - person Hopeless; 18.07.2019

Я использовал emoji в своей строке, что было причиной этой ошибки.

Поэтому убедитесь, что вы не используете неправильную строку, которая недопустима для сохранения в базе данных.

person MD SHAYON    schedule 07.04.2021

ДЛЯ SQLALCHEMY И PYTHON

Кодировка, используемая для Unicode, традиционно была «utf8». Однако для версий MySQL 5.5.3 и более поздних версий была введена новая специфичная для MySQL кодировка 'utf8mb4', а начиная с MySQL 8.0 сервер выдает предупреждение, если в каких-либо директивах на стороне сервера указана простая utf8, замененная на utf8mb3. Обоснование этой новой кодировки связано с тем, что устаревшая кодировка MySQL utf-8 поддерживает только кодовые точки до трех байтов вместо четырех. Следовательно, при взаимодействии с базой данных MySQL, которая включает кодовые точки размером более трех байтов, предпочтительнее использовать этот новый набор символов, если он поддерживается как базой данных, так и клиентским DBAPI, например:

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

введите здесь описание ссылки

person Nick Po    schedule 02.06.2019