Проблема кодирования Neo4j (я подозреваю) с символами UTF-8, использующими Neo4jphp
Я пытаюсь просто извлечь из таблицы строк MySQL в кодировке UTF-8 и создать из них узлы. Он работает нормально, пока не попадет в строку с названием "Country House Café".
Я использую библиотеку оболочки neo4jphp для REST API.
Я вытягиваю строки с помощью основного выбора PDO:
$results = $db->query("SELECT * FROM table WHERE name is not null");
$rows = $results->fetchAll(PDO::FETCH_ASSOC);
Затем я перебираю строки:
foreach($rows as $row){
try {
$node = $client->makeNode($row);
$node->save();
} catch (Exception $e) {
var_dump($row); exit;
}
}
Он радостно перебирает создание и сохранение узлов, пока не достигнет того, чье свойство name называется строкой Country House Café. Это вызывает исключение, которое выглядит следующим образом
Headers: Array
(
[Content-Type] => application/json; charset=UTF-8; stream=true
[Access-Control-Allow-Origin] => *
[Transfer-Encoding] => chunked
[Server] => Jetty(9.0.5.v20130815)
)
Body: Array
(
[message] => Could not set property "name", unsupported type: null
[exception] => PropertyValueException
[fullname] => org.neo4j.server.rest.web.PropertyValueException
[stacktrace] => Array
(
[0] => org.neo4j.server.rest.domain.PropertySettingStrategy.setProperty(PropertySettingStrategy.java:141)
[1] => org.neo4j.server.rest.domain.PropertySettingStrategy.setProperties(PropertySettingStrategy.java:88)
[2] => org.neo4j.server.rest.web.DatabaseActions.createNode(DatabaseActions.java:214)
[3] => org.neo4j.server.rest.web.RestfulGraphDatabase.createNode(RestfulGraphDatabase.java:238)
[4] => java.lang.reflect.Method.invoke(Method.java:483)
[5] => org.neo4j.server.rest.transactional.TransactionalRequestDispatcher.dispatch(TransactionalRequestDispatcher.java:139)
[6] => org.neo4j.server.rest.security.SecurityFilter.doFilter(SecurityFilter.java:112)
[7] => java.lang.Thread.run(Thread.java:745)
)
)
Теперь, если я вручную сделаю что-то подобное в PHP, все работает:
$node = $client->makeNode(array("name" => "Country House Café"));
$node->save();
Кто-нибудь знает, что может быть виновником здесь?
1 ответ
Хорошо, яйцо на моем лице - разобрался, это было на самом деле с моим использованием PDO.
Теперь я полностью осознаю, что PDO не использует кодировку по умолчанию для вашей БД, таблицы или просто UTF8. Я все еще не совсем уверен, где он выбирает кодировку по умолчанию, и не чувствую желания исследовать это дальше.
Мой оригинальный DSN был
$dsn = "mysql:host=$hostname;dbname=$database";
$db = new \PDO($dsn, $username, $password);
Я изменяю это, чтобы добавить DB.
$dsn = "mysql:host=$hostname;dbname=$database;charset=utf8";
Бинго, магия.