Неверное строковое значение: '\ 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;
Ответы
Ответ 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.
Это работает для моего приложения.