Не могу вставить UTF8 символов в MySQL (с сопоставлением UTF8, набор символов и набор имен) - PullRequest
4 голосов
/ 30 ноября 2010

я столкнулся с действительно серьезной проблемой здесь ... у меня есть все в UTF-8, все мои БД и таблицы являются utf8_general_ci, но при попытке вставить или обновить из одного скрипта PHP все, что я вижу, это символы ... но если я редактируюв phpmyadmin слова отображаются правильно ... я обнаружил, что если я запускаю функцию utf8_decode () для моих строк в php, я могу заставить это работать, но я не планирую делать это, потому что это беспорядок, и он должен работать без этого:S

Вот базовый код, который я использую для проверки этого:

<?php
$conn=mysql_connect("localhost","root","root") 
  or die("Error");
mysql_select_db("mydb",$conn) or
  die("Error");
mysql_query("UPDATE `mydb`.`Clients` SET `name` = '".utf8_decode("Araña")."' WHERE `Clients`.`id` =25;", 
   $conn) or die(mysql_error());
mysql_close($conn);
echo "Success.";
?>

Это то, что я получаю, если не декодирую utf8 с помощью функции php utf8_decode:

вместоAraña, я получаю: Araña

Ответы [ 3 ]

4 голосов
/ 27 июня 2011

Я сталкивался с одной и той же проблемой много раз.Иногда это происходит из-за того, что тип ссылки на базу данных, которую я выбираю, не совпадает с типом, который я использую для вставки, а иногда - из данных файла в базу данных.

Для более позднего экземпляра mysql_set_charset('utf8',$link); - магический ответ.

Выполните вызов mysql_set_charset сразу после выбора базы данных с помощью mysql_select_db.

@ ref http://php.net/manual/en/function.mysql-set-charset.php

1 голос
/ 28 июня 2011

Этот DDL, который вы упомянули, имеет отношение к сопоставлению, а не к набору символов.Правильное утверждение будет следующим:

ALTER TABLE Clients CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Вам все еще нужно убедиться, что клиентская библиотека (libmysql или любой другой драйвер, используемый PHP) не транскодирует данные обратно в ISO-8859.mysql_set_charset ('utf8') явно установит кодировку клиента в UTF-8.Кроме того, вы можете отправить SET NAMES UTF8;сразу после подключения к базе данных.Чтобы сделать это неявно, вы можете изменить блок my.cnf [client], чтобы в качестве кодировки символов клиента использовался utf-8 (и /etc/init.d/mysql reload для применения).В любом случае, убедитесь, что клиент не манипулирует полученными результатами.

[клиент] default-character-set = utf8

Вам не нужно использовать utf8_decode, если вы используетеmbstrings.Следующая конфигурация php.ini должна обеспечивать поддержку UTF-8 на стороне PHP:

mbstring.internal_encoding = utf-8
mbstring.http_output = utf-8
mbstring.func_overload = 6

Наконец, когда вы отображаете результаты в HTML, убедитесь, что кодировка страницы явно UTF-8.

1 голос
/ 30 ноября 2010

"Araña" - UTF-8.Символы «Ã ±» представляют два байта, в которые кодируется испанский - в UTF-8.Все, что вы читаете обратно, не обрабатывает UTF-8 и отображает его как (кажется) ISO-8859-1.

...