Я работаю с базой данных, которая использует кодировку UTF8 и имеет множество имен пользователей, которые содержат специальные символы, такие как «Ғђ ▫ Sony»Lumen MySQL запрос не обрабатывает значение UTF8, как и ожидалось
При запросе таблицы пользователя , Люмен отвечает неверными данными. Я пробовал запросить ту же таблицу, используя mysqli
и PDO
, и получаю ожидаемые результаты. Я создал маршрут образец, чтобы проверить его:
$app->get("charset", function() {
$mysqli = new mysqli("localhost", "user", "password", "database");
$res = $mysqli->query("select name from users where id = 1");
$dbh = new PDO('mysql:host=localhost;dbname=database', "user", "password");
$stmt = $dbh->query("select name from users where id = 1");
$lumen = DB::select("select name from users where id = 1");
return response()->json([
"mysqli" => $res->fetch_assoc(),
"pdo" => $stmt->fetchAll(PDO::FETCH_ASSOC),
"framework" => $lumen
]);
});
При обращении к маршруту, я получаю следующий ответ:
{
"mysqli": {
"name": "Ғђ ▫ Sony"
},
"pdo": [
{
"name": "Ғђ ▫ Sony"
}
],
"framework": [
{
"name": "Ò’Ñ’ â–« Sony"
}
]
}
Вот скриншот ответа в случае, если текст выше не отображается правильно :
насколько я могу сказать, люмен MySQL конфигурации по умолчанию в UTF8 и неизменно - я нашел следующие vendor/laravel/lumen-framework/config/database
:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => env('DB_PREFIX', ''),
'timezone' => env('DB_TIMEZONE','+00:00'),
'strict' => false,
],
Я в недоумении относительно того, что может быть причиной этого. Что еще я могу сделать, чтобы попытаться отследить это несоответствие?
Правильно ли хранится сохранение данных в базе данных? Вы можете увидеть специальные символы, созданные правильно, скажем, используя MYSQL Workbench или аналогичный инструмент, который вы используете? –
Когда я запрашиваю его через MySQL Workbench, он возвращает имя «Ò'Ñ» â «Sony». Я попробовал добавить 'SET NAMES 'utf8'', но, похоже, это не имеет никакого эффекта. –
проблемы с кодировкой всегда много удовольствия, у меня тоже были некоторые ... если вы считаете, что настройки БД хороши, вы можете дважды проверить, работает ли остальная работа ... перед тем, как распечатать ваши результаты, это сделает changes ..... header ('Content-Type: text/html; charset = utf-8'); // (поместите его перед тем, как начать печатать наши вещи) – lauw