我正在對正在使用UTF8編碼,具有包含特殊字符的很多的用戶名,如「Ғђ▫索尼」流明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'',但它似乎沒有效果。 –
編碼問題總是很有趣,我有一些自己......如果你認爲數據庫設置是好的,你可能要仔細檢查,如果其餘的工作....在打印出你的結果之前,這會使更改..... header('Content-Type:text/html; charset = utf-8'); //(在你開始打印我們的東西之前將其放置) – lauw