UTF8 выдает PHP → MySQL. Получение вопросительных знаков в базе данных?

ОК, я в настоящее время в PHP/MySQL/UTF-8/Unicode hell!

Моя среда: MySQL: 5.1.53 Серверный набор: latin1 Db characterset: latin1 Клиентский набор символов: latin1 Коннекторы: latin1

PHP: 5.3.3

Мои файлы PHP сохраняются как формат UTF-8, а не файлы ASCII.

В моем PHP-коде, когда я делаю подключение к базе данных, я делаю следующее:

ini_set('default_charset', 'utf-8');
$my_db = mysql_connect(DEV_DB, DEV_USER, DEV_PASS);
mysql_select_db(MY_DB);
// I have tried both of the following utf8 connection functions
// mysql_query("SET NAMES 'utf8'", $my_db);
mysql_set_charset('utf8', $my_db);
// Detect if form value is not UTF-8
if (mb_detect_encoding($_POST['lang_desc']) == 'UTF-8') {
$lang_description = $_POST['lang_desc'];
} else {
$lang_description = utf8_encode($_POST['lang_desc']);
}
$language_sql = sprintf(
'INSERT INTO app_languages (language_id, app_id, description) VALUES (%d, %d, "%s")',
                            intval($lang_data['lang_id']),
                            intval($new_app_id),
                            mysql_real_escape_string($lang_description, $my_db)
);

Формат/создание моей базы данных MySQL:

СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ app_languages (   language_id int (10) unsigned NOT NULL,   app_id int (10) unsigned NOT NULL,   description tinytext collate utf8_unicode_ci,   ПЕРВИЧНЫЙ КЛЮЧ (language_id, app_id) ) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

Операторы SQL, созданные из моего кода PHP, выглядят следующим образом:

INSERT INTO app_languages (language_id, app_id, description) VALUES (91, 2055, "阿拉伯体育新闻和信息")
INSERT INTO app_languages (language_id, app_id, description) VALUES (26, 2055, "阿拉伯體育新聞和信息")
INSERT INTO app_languages (language_id, app_id, description) VALUES (56, 2055, "בערבית ספורט חדשות ומידע")
INSERT INTO app_languages (language_id, app_id, description) VALUES (69, 2055, "アラビア語のスポーツニュースと情報")

Тем не менее, вывод появляется в моей базе данных следующим образом:

|          69 |   2055 | ?????????????????                               |
|          56 |   2055 | ?????? ????? ????? ?????                        |
|          28 |   2055 | Arapski sportske vijesti i informacije          |
|          42 |   2055 | Arabe des nouvelles sportives et d\'information |
|          91 |   2055 | ??????????                                      |

Что я делаю неправильно?

P.S. Мы можем использовать Putty для SSH непосредственно на сервере базы данных и через командную строку. Вставить один из операторов unicode/multi-lingual insert. И они успешно работают!?

Спасибо за любой свет, который вы можете пролить на это, это сводит меня с ума.

Приветствия, Джейсон

Ответы

Ответ 1

попробуйте выполнить следующий запрос после того, как вы выбрали db:

SET NAMES 'utf8'

этот запрос должен решить проблему с разными кодировками в ваших файлах и db.

Феликс

Ответ 2

Ответ правильный в вашем вопросе. Вы используете latin1 во всей базе данных и не можете обрабатывать unicode. Вам также нужно изменить их на UTF-8.

Ответ 3

 //first make sure your file produce utf-8 chars
 header('Content-Type: text/html; charset=utf-8');

Ответ 4

mb_detect_encoding совершенно бесполезен, если вы уже не знаете, с чем имеете дело. Вероятно, вам не стоит полагаться на него, если вы не укажете второй и третий аргументы. В настоящее время он, вероятно, не возвращает то, что вы думаете.

Ответ 5

Я вижу, что слова, которые вы видели как ???????, являются арабскими словами.., которые должны иметь сортировку

cp1256_general_ci

не

UTF-8_general_ci

измените это, оно может решить проблему.