2015-05-14 7 views
2

Я работаю с базой данных, которая использует кодировку 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" 
    } 
    ] 
} 

Вот скриншот ответа в случае, если текст выше не отображается правильно : broken UTF8 response

насколько я могу сказать, люмен 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, 
], 

Я в недоумении относительно того, что может быть причиной этого. Что еще я могу сделать, чтобы попытаться отследить это несоответствие?

+0

Правильно ли хранится сохранение данных в базе данных? Вы можете увидеть специальные символы, созданные правильно, скажем, используя MYSQL Workbench или аналогичный инструмент, который вы используете? –

+0

Когда я запрашиваю его через MySQL Workbench, он возвращает имя «Ò'Ñ» â «Sony». Я попробовал добавить 'SET NAMES 'utf8'', но, похоже, это не имеет никакого эффекта. –

+0

проблемы с кодировкой всегда много удовольствия, у меня тоже были некоторые ... если вы считаете, что настройки БД хороши, вы можете дважды проверить, работает ли остальная работа ... перед тем, как распечатать ваши результаты, это сделает changes ..... header ('Content-Type: text/html; charset = utf-8'); // (поместите его перед тем, как начать печатать наши вещи) – lauw

ответ

1

Этот ответ основан на моих предыдущих комментариях выше.

Шрифт соединения MySQL определяет, какая кодировка используется для связи между клиентом MySQL (PHP) и сервером. Не имеет значения, какая кодировка используется как внутренняя кодировка в фактических таблицах MySQL. Сервер MySQL автоматически преобразует данные между кодировкой таблицы и кодированием соединения. Таким образом, кодировка соединения в основном определяет формат, в котором вы ожидаете получить данные из MySQL, а также в каком формате вы вставляете данные в MySQL.

Вы уверены, что данные правильно закодированы в utf8 в базе данных?

Похоже, что вы используете UTF8 только для соединения с просветом DB (если это по умолчанию), но вы не используете UTF8 с примерами подключения mysqli или PDO. Получаете ли вы тот же результат, если вы установили кодировку mysqli с помощью $mysqli->set_charset("utf8"); и кодировки PDO, используя new PDO('mysql:host=localhost;dbname=database;charset=utf8', "user", "password");?

Основываясь на вашем примере кода и примере, кажется, что вы правильно получаете данные в UTF8 из соединения Lumen DB, но вывод не отображается как UTF8.

Это также объясняет, почему вывод mysqli и PDO показан правильно, потому что они не возвращают данные в UTF8 (потому что вы не установили свою кодировку соединений в UTF8), но по умолчанию они, похоже, соответствуют любой кодировке, повторное отображение вывода (видимо, «latin1» или совместимого).

Если вы просматриваете вывод в веб-браузере, убедитесь, что кодировка выходной страницы определена правильно (например, с использованием заголовка).

Edit:

Btw это не имеет значения, что соединение кодирования используется в другой системе, которая вставляет данные до тех пор, как кодирование соединение соответствует кодирование данных, отправляемых через соединение.

Настройка кодирования соединения на latin1 означает, что вы получите строковые данные как latin1 при выполнении SELECT. Таким образом, казалось бы, ваш выход обрабатывается как latin1 вместо UTF-8.Возможно, было бы лучше, если бы вы исправили вывод своего скрипта, чтобы правильно отображать «как UTF-8», если ваша среда вывода (например, веб-браузер) поддерживает его. Потому что в противном случае у вас будут проблемы, если вам нужно обрабатывать символы, которые нельзя отобразить на латинском языке1. Хотя, если вы выходите на терминал/консоль CLI, то, конечно, вы должны использовать ту же кодировку, что и ваша конечная кодировка по умолчанию (что может быть UTF-8 или что-то еще). Я предпочитаю, чтобы мои Linux-терминалы также настраивались как UTF-8.

+0

Сложная вещь во всем этом заключается в том, что выходная кодировка моей страницы - UTF-8. Я уверен в этом на 1000%, потому что я дважды проверил ее дюжину раз. В любом случае, ваш ответ помог мне заставить его работать, так что это достаточно хорошо для меня. Еще раз спасибо! –