Проблемы с отправкой символов латинского акцентирования (ã,õ,á,é,í,…) в таблицу базы данных в PHP/MySQL
У меня проблемы с отображением в таблице mydatabase символов латинского алфавита. (Ä, ö,á,é,í,...). Я использую сервер WAMP с Apache 2.4.9 и MySQL 5.6.17.
У меня есть простая форма, которую я создал в HTML, и у меня есть PHP-код, который запускает запрос и создает учетную запись. Вот код PHP:
include('config.php'); //My database data for connection
if(isset($_POST['submit'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$query = "INSERT INTO account SET username = '".$username."', password = PASSWORD('".$password."'), email = '".$email."'";
$execute_query = mysqli_query($connection, $query);
if($execute_query) {
//Creates the account
}
else {
//If an error occures
}
}
Теперь, например, я создаю учетную запись с:
Username: Luís
Password: 1234
E-mail: somemail@mail.com
Когда я проверяю таблицу, она показывает созданную учетную запись, но имя пользователя показывает LuÃs вместо Luís.
Вещи, которые я пробовал:
Creating a DataBase and Table with:
utf8_general_ci
utf8_unicode_ci
utf8mb4_general_ci
utf8mb4_unicode_ci
latin1_swedish_ci
Никто из них не работал, это всегда показывает, что М вместо í.
2 ответа
Я исправил проблему с помощью запроса "SET NAMES utf8".
include('config.php'); //My Database data for connection.
//Connection set with $connection = mysqli_connect($mysql_host, $mysql_user, $mysql_pass, $mysql_db)
if(isset($_POST['submit'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$connection->query("SET NAMES utf8"); //FIXED (Gets $connection from config.php and runs the query "SET NAMES utf8")
$query = "INSERT INTO account SET username = '".$username."', password = PASSWORD('".$password."'), email = '".$email."'";
$execute_query = mysqli_query($connection, $query);
if($execute_query) {
//Creates the account
}
else {
//If an error occures
}
}
Спасибо @JakeGould за попытку помочь мне, ведь у меня не было проблем с таблицей базы данных. Моя база данных и таблица были установлены с CHARSET=utf8 и COLLATE=utf8_unicode_ci.
Диагностика корня проблемы.
У меня проблемы с отображением в таблице mydatabase символов латинского алфавита. (Ä, ö,á,é,í,...)
Это имеет все признаки несоответствия кодировки между вашими данными формы HTML, файлом PHP и MySQL. Полагаю, проблема в том, что ваша HTML-форма и PHP-файл отправляют данные UTF8 - поскольку в настоящее время UTF8 является методом кодирования по умолчанию - в базу данных MySQL, которая настроена (по умолчанию) для использования latin1_swedish_ci
кодирование.
Так что это одна из тех проблем "шесть из одного, полдюжины из других", где вы можете теоретически изменить кодировку в файле HTML и PHP, чтобы latin1_swedish_ci
, Но это довольно регрессивно в современном мире Интернета и мире веб-разработки.
Поэтому я бы порекомендовал убедиться, что вся ваша цепочка данных- от формы HTML до PHP и базы данных MySQL - полностью соответствует UTF8. Как только вы получите все в UTF8, жизнь станет намного проще по многим причинам.
Что касается того, почему вы видите эту проблему, потому что (по умолчанию) большинство установок MySQL установлено latin1_swedish_ci
вместо utf8_general_ci
для вновь созданных баз данных. Так что вы на правильном пути в своих попытках исправить это.
Но есть несколько вещей, которые вам нужно сделать, чтобы получить базу данных MySQL - и сервер Datives - для правильной обработки кодировки символов и, в данном случае, кодировки UTF8.
Шаги, которые вы можете предпринять, чтобы решить проблему.
Сначала измените параметры сортировки базы данных и повторите попытку.
ALTER DATABASE [name of your database] CHARACTER SET utf8;
Если это конкретная таблица, параметры сортировки можно изменить следующим образом:
ALTER TABLE [name of your table] CONVERT TO CHARACTER SET utf8;
И если это конкретный столбец в таблице:
ALTER TABLE [name of your table] MODIFY [name of your column] [other settings] CHARACTER SET utf8 COLLATE utf8_general_ci;
Или, возможно, вы можете экспортировать текущую базу данных, создать новую базу данных с помощью этой команды и повторно импортировать данные:
CREATE DATABASE [name of your database] CHARACTER SET utf8 COLLATE utf8_general_ci;
И если вы хотите внести постоянные изменения в установку MySQL на компьютере, что вызывает проблемы, перейдите и отредактируйте my.cnf
, Следующее установит всю цепочку в UTF-8:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8