Я нахожусь в ситуации, когда мне нужно обновить некоторые строки в таблице с именем «matrículas». Запрос выглядит примерно так:
UPDATE `matrículas` SET...
Когда я запускаю этот запрос в моей программе SQL (HeidiSQL) напрямую, он выполняется без проблем. Когда я делаю это в PHP через объект PDO, я получаю следующую ошибку:
SQLSTATE[HY000]: General error: 1300 Invalid utf8 character string: 'matr\xEDculas'
Мой объект PDO настроен так:
$db= new PDO(
'mysql:host='.$credentials['host'].';dbname='.$credentials['dbname'].';charset=utf8',
$credentials['user'],
$credentials['password'],
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Фактическое обновление выполняется путем выполнения вышеуказанного запроса и выполнения этого:
$query = $this->db->prepare($sql);
$query->execute($params);
И таблица, и база данных были созданы с использованием utf8_general_ci
сверка.
Есть идеи, что я делаю не так? Кстати, я сейчас тестирую в Windows на случай, если это как-то связано с этим …
ERROR 1300 (HY000): Invalid utf8 character string: 'matr\xEDculas'
\xNN
нотация дает шестнадцатеричное закодированное значение для недопустимых байтов в строке символов.
Кодовая точка Unicode 237 (í), когда кодируется в utf-8, является 2-байтовым символом, который кодируется как 0xC3
0xAD
… но ошибка показывает 0xED
, который случается ISO / IEC-8859-1 (Latin1) кодировка для символа í
,
Поскольку ошибка связана с тем, что имя столбца передается из сценария, а не из внешних данных, это говорит о том, что проблема заключается в том, что сам сценарий PHP имеет неправильно закодированное имя столбца, поскольку набор символов, в котором был сохранен сценарий ISO-8859-1, а не UTF-8.
`matrículas`
это кодировка cp866-gp2312
пожалуйста, измените его на UTF-8, как matriculas
у меня другой стиль кодирования
Если вы должны использовать акцентированные буквы в именах таблиц, то они должны быть закодированы в UTF-8
в клиенте.
То есть это не PDO
проблема, но проблема кодирования — ваш исходный редактор / язык / что угодно.