Почему utf8mb4 в mysql DB, Table, column дает ошибку при вставке специальных символов? - PullRequest
0 голосов
/ 05 мая 2018

MySQL версия:

mysql  Ver 14.14 Distrib 5.6.40, for Linux (x86_64) using  EditLine wrapper

Я установил utf8mb4 на database, table, column, используя следующие команды:

ALTER DATABASE my_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

И MySQL сообщает, что:

mysql> show create database my_db;
+----------+---------------------------------------------------------------------+
| Database | Create Database                                                     |
+----------+---------------------------------------------------------------------+
| my_db    | CREATE DATABASE `my_db` /*!40100 DEFAULT CHARACTER SET utf8mb4 */   |
+----------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

А также таблица:

ALTER TABLE my_tbl CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci

Mysql сообщает, что:

...
) ENGINE=InnoDB AUTO_INCREMENT=14894 DEFAULT CHARSET=utf8mb4

Теперь само поле также конвертируется:

ALTER TABLE my_tbl MODIFY body mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Он сообщает, что:

  `body` mediumtext

Кажется, все в порядке. Когда я подключаюсь к mySQL через python, я устанавливаю параметры сортировки:

   my_connection.set_character_set('utf8mb4')

Теперь, когда я вставляю данные, появляется сообщение об ошибке:

OperationalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x98\\x9E</...' for column 'body' at row 1")

Почему выдает такую ​​ошибку? Как мне решить эту проблему? Или есть ли обходной путь для этого?


Редактировать часть-1:

CREATE TABLE `my_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `for_id` varchar(100) NOT NULL,
  `uid` varchar(50) DEFAULT NULL,
  `sent_at` datetime DEFAULT NULL,
  `rec_type` varchar(30) DEFAULT NULL,
  `body` mediumtext CHARACTER SET utf8mb4,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=112774 DEFAULT CHARSET=utf8mb4

Вышеуказанный набор символов находится на моем столе. Перед столбцом не видно тип сортировки. Как я уже говорил, у меня есть команда Modify command. Здесь что-то не так?

В my.cnf Я установил ниже и перезапустил mysql:

[mysqld]
collation-server = utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
skip-character-set-client-handshake

[client]
default-character-set   = utf8mb4

[mysql]
default-character-set   = utf8mb4

1 Ответ

0 голосов
/ 06 мая 2018

set_character_set - это одна из трех настроек.

Подробнее о Python: http://mysql.rjweb.org/doc.php/charcoll#python (но используйте utf8mb4 там, где написано utf8).

Убедитесь, что столбец действительно установлен в utf8mb4: Do SHOW CREATE TABLE.

...