Проблеми, що надсилають символи з наголосом на латинській мові (ã, õ, á, é, í,…) до таблиці бази даних у PHP / MySQL


3

У мене виникають проблеми з тим, щоб таблиця моєї бази даних показувала латинські символи. (ã, õ, á, é, í,…). Я використовую сервер 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.


0

Діагностування кореня проблеми.

У мене виникають проблеми з тим, щоб таблиця моєї бази даних показувала латинські символи. (ã, õ, á, é, í,…)

Це має всі ознаки невідповідності кодування між вашими даними 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 і сервіс дативів, встановлену для правильної обробки кодування символів і, в даному випадку, кодування 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

1
latin1_swedish_ci??? чому вони вибрали шведський код, встановлений за замовчуванням?
DavidPostill


Нічого не працювало. Я запустив запити і змінив my.cnf, але нічого. Можливо, це має щось спільне із запитом, на який я працюю, щоб створити обліковий запис?
Жоао Луїс

@ JoãoLuís Ви також перезапустили сервер MySQL? А що з Apache? Яку версію Apache ви використовуєте?
JakeGould

@JakeGould Дякую за уроки дрібниць;) Однак, за посиланням "Чудово бачити, що після чого, 20 років? Вони змінили це на здоровий дефолт, як utf8_general_ci. Гарна робота, MySQL"
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.