Вставка кодированной строки UTF-8 в кодированную таблицу mysql с кодировкой UTF-8 с «Неверным строковым значением»

Вставка кодированной строки UTF-8 в кодированную таблицу UTF-8 дает неправильное строковое значение.

PDOException: SQLSTATE [HY000]: Общая ошибка: 1366 Неверное строковое значение: '\ xF0 \ x9D \ x84 \ x8E i …' для столбца body_value в строке 1: INSERT INTO

У меня есть 𝄎 в строке, которую mb_detect_encoding утверждает, кодируется UTF-8. Я пытаюсь вставить эту строку в таблицу MySQL, которая определяется как (среди прочего) DEFAULT CHARSET=utf8

Изменить: Drupal всегда выполняет SET NAMES utf8 с дополнительным COLLATE (по крайней мере, при разговоре с MySQL).

Редактирование 2: Более подробная информация, которая кажется актуальной. Я хватаю некоторый текст из базы данных PostgreSQL. Я привязываю его к объекту, используйте mb_detect_encoding, чтобы проверить, что это UTF-8, и сохраняйте объект в базе данных, используя node_save . Поэтому, пока есть HTTP-запрос, который запускает импорт, данные не поступают из браузера.

Редактирование 3: данные денормализуются по двум таблицам:

SELECT character_set_name FROM information_schema. COLUMNS C WHERE table_schema = "[database]" AND table_name IN ("field_data_body", "field_revision_body") AND column_name = "body_value";

 >+--------------------+ | character_set_name | +--------------------+ | utf8 | | utf8 | +--------------------+ 

Изменить 4: Возможно ли, что персонаж «новый»? Я немного расплывчатый в отношениях между unicode и UTF-8 , но эта статья в Википедии подразумевает, что персонаж был стандартизирован совсем недавно.

Я не понимаю, как это может произойти с «Неверным строковым значением».

𝄎 (U + 1D10E) является символом Unicode, найденным вне BMP (Basic Multilingual Plane) (выше U + FFFF) и поэтому не может быть представлен в UTF-8 в 3 байтах. MySQL charset utf8 принимает только символы UTF-8, если они могут быть представлены в 3 байтах. Если вам нужно сохранить это в MySQL, вам нужно будет использовать charset MySQL utf8mb4. Вам понадобится MySQL 5.5.3 или новее. Вы можете использовать ALTER TABLE для изменения набора символов без особых проблем; поскольку для хранения символов требуется больше места, возникают проблемы с паролями, которые могут потребовать уменьшения размера строки. См. http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-upgrading.html .

для решения этой проблемы сначала измените поле базы данных на charset utf8m4b. Например:

 ALTER TABLE `tb_name` CHANGE `field_name` `field_name` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL; 

затем в вашем соединении с db установите для него драйвер_options на utf8mb4. Например, если вы используете PDO

 $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password'); 

или в рамках zend 1.2

 $dbParam = array('host' => 'localhost', 'username' => 'db_user_name', 'password' => 'password', 'dbname' => 'db_name', 'driver_options' => array( '1002' => "SET NAMES 'utf8mb4'", '12' => 0 ) ); 

В вашем PDO-подключении установите кодировку.

 new PDO('mysql:host=localhost;dbname=the_db;charset=utf8', $user, $password);