Вставка кодированной строки UTF-8 в кодированную таблицу UTF-8 дает неправильное строковое значение.
PDOException: SQLSTATE [HY000]: Общая ошибка: 1366 Неверное строковое значение: '\ xF0 \ x9D \ x84 \ x8E i …' для столбца body_value в строке 1: INSERT INTO
- Любая идея для отправки POST для функции (url) через jquery-fancybox?
- Получение образования с помощью API-интерфейса Facebook в PHP
- Codeigniter, когда я нажимаю delete, я хочу всплывающее уведомление, если при нажатии «да» или нет
- Неправильно ли использовать точечную нотацию в Mustache (php)?
- Почему некоторые операции с потоковыми массивами в PHP, похоже, не работают?
У меня есть 𝄎
в строке, которую 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);