Невозможно правильно вставить греческие символы в базу данных mysql

Наша база данных mysql показывает Î Î¿Î»Ï Î³Î»Ï…ÎºÏŒÏ вместо греческих символов при отправке данных из эмулятора в базу данных mysql. Остальные символы остаются в порядке.

скриншот от phpMyAdmin:

данные

ОБНОВИТЬ:

После использования

@ Félix Gagnon-Grenier отвечает в моем коде, это дает мне следующее:

База данных

Sql для создания таблицы

 CREATE TABLE `cart` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `product_name` varchar(255) NOT NULL, `product_price` double(3,2) NOT NULL, `product_image` varchar(255) NOT NULL, `quantity` int(11) NOT NULL, `preferation1` varchar(50) NOT NULL, `preferation2` varchar(50) NOT NULL, `preferation3` varchar(50) NOT NULL, `preferation4` varchar(50) NOT NULL, `magazi_id` int(11) NOT NULL, `servitoros_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 

введите описание изображения здесь

PHP

 <?php error_reporting(E_ALL ^ E_NOTICE); ini_set("default_charset", "UTF-8"); header('Content-type: text/html; charset=UTF-8'); mb_internal_encoding('UTF-8'); mb_http_input("utf-8"); try { $handler = new PDO('mysql:host=localhost;dbname=database', 'username', 'password'); $handler->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8' COLLATE 'utf8_general_ci' "); $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $e) { echo $e->getMessage(); die(); } $productName = $_POST['productName']; $productPrice=$_POST['productPrice']; $productImage = $_POST['productImage']; $quantity = $_POST['quantity']; $sugar = $_POST['sugar']; $milk = $_POST['milk']; $flavor=$_POST['flavor']; $comment = $_POST['comment']; $magazi = $_POST['magazi_id']; $servitoros = $_POST['servitoros_id']; $handler->query("INSERT INTO cart(id, product_name, product_price, product_image, quantity, preferation1, preferation2, preferation3, preferation4, magazi_id, servitoros_id) VALUES('', '$productName','$productPrice','$productImage', '$quantity', '$sugar', '$milk', '$flavor', '$comment', '$magazi', '$servitoros')"); die(); ?> 

Ява

 protected Void doInBackground(String... params) { nameValuePairs = new ArrayList<>(); nameValuePairs.add(new BasicNameValuePair("productName", productName)); nameValuePairs.add(new BasicNameValuePair("productPrice", String.valueOf(price))); nameValuePairs.add(new BasicNameValuePair("productImage", image)); nameValuePairs.add(new BasicNameValuePair("quantity", String.valueOf(quantityNumberFinal))); nameValuePairs.add(new BasicNameValuePair("sugar", sugarPreference)); nameValuePairs.add(new BasicNameValuePair("milk", milkPreference)); nameValuePairs.add(new BasicNameValuePair("flavor", flavorPreference)); nameValuePairs.add(new BasicNameValuePair("comment", comment)); nameValuePairs.add(new BasicNameValuePair("magazi_id", String.valueOf(2))); nameValuePairs.add(new BasicNameValuePair("servitoros_id", String.valueOf(13))); try { HttpParams httpParams = new BasicHttpParams(); HttpProtocolParams.setContentCharset(httpParams, "UTF-8"); httpClient = new DefaultHttpClient(httpParams); httpPost = new HttpPost(params[0]); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); response = httpClient.execute(httpPost); httpEntity = response.getEntity(); is = httpEntity.getContent(); } catch(Exception e) { Log.e("Fail 1", e.toString()); } return null; } 

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

Существует довольно много настроек, которые должны быть правильно определены, и я настоятельно рекомендую UTF-8, так как у этого есть большинство писем, которые вам понадобятся (скандинавский, греческий, арабский, русский и т. Д.).

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

Заголовки

  • Установка кодировки в заголовках HTML и PHP на UTF-8

    • PHP:

       header('Content-Type: text/html; charset=utf-8'); 

      (Заголовки PHP должны быть помещены перед любым выходом (эхо, пробел, HTML)!)

    • HTML:

       <meta charset=utf-8" /> 

      (HTML-заголовки помещаются в <head> / </head> )

соединение

  • Вам также необходимо указать кодировку в самом соединении . Для вашего примера PDO это делается так:

     $handler = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET UTF8")); 

    Обратите внимание на charset=utf8 -attribute. Другие MySQL-API имеют разные способы сделать это, если вы будете использовать что-то еще в будущем.

База данных

  • Ваша база данных и ее таблицы должны быть установлены в UTF-8. Обратите внимание, что кодировка не совпадает с сортировкой. Я вижу, что вы уже настроили сопоставление с UTF-8, так что это хорошо, но делайте то же самое для всей базы данных и всех таблиц.

    Вы можете сделать это, выполнив нижеуказанные запросы для каждой базы данных и таблиц (например, в phpMyAdmin)

     ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

    Обратите внимание, что любые данные, уже сохраненные в базе данных, автоматически не будут исправлены. Поэтому важно, чтобы вы делали это до того, как вставляете данные, или что вы повторно вставляете их после установки кодировки.

Спецификация php.ini

  • В вашем файле php.ini вы должны указать кодировку по умолчанию для своей платформы, например

     default_charset = "utf-8"; 

Файл-кодирование

  • Также важно, чтобы сам файл .php кодировался в формате UTF-8. Если вы используете Notepad ++ для написания кода, это можно сделать в раскрывающемся списке «Формат» на панели задач.

Emojis

  • В MySQL (как в таблице, базе данных, так и в объекте-подключении) вам нужно указать кодировку utf8mb4 , в отличие от обычного utf8 , если вы хотите работать с emojis.

Я мало знаю о Java, но если вы также можете установить атрибуты для UTF-8, сделайте это. В сущности, все, что может быть установлено для определенной кодировки, должно быть одинаковым.

Если вы будете следовать всем указателям выше, вероятность того, что ваша проблема будет решена. Если нет, вы можете взглянуть на эту запись StackOverflow: UTF-8 на всем протяжении .

Отличное введение об использовании UTF8 с PHP и Mysql можно найти в этом блоге . Основные моменты:

  1. Установите таблицы базы данных в UTF8
  2. В вашем php.ini установлен default_charset = "utf-8";
  3. После установления соединения вам может потребоваться выполнить следующую команду / запрос: set names UTF-8;

Думаю, вам не хватает пункта 3.

В вашем скрипте PHP вы должны сделать что-то вроде этого (untested):

 $handler = new PDO('mysql:host=localhost;dbname=database', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8;SET CHARACTER SET UTF8;')); 

Вся ваша установка php / mysql, кажется, закодирована с помощью utf-8, но код java не начинается, начиная оттуда:

 httpClient = new DefaultHttpClient(); httpPost = new HttpPost(params[0]); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

Во-первых, класс DefaultHttpClient кажется устаревшим. Однако, документы говорят, что

Этот класс задает следующие параметры, если они явно не заданы:

  • ContentCharset: HTTP.DEFAULT_CONTENT_CHARSET

Шифр http по умолчанию – ISO-8859-1 соответствии со значениями значения константы java

Сама HttpPost , не смешивается с наборами символов.

Но UrlEncodedFormEntity делает. Также из документов:

 UrlEncodedFormEntity (параметры Iterable)
 Создает новый UrlEncodedFormEntity со списком параметров с кодировкой по умолчанию HTTP.DEFAULT_CONTENT_CHARSET

Поскольку ISO-8859-1 не может хранить греческие символы, их передача через эти экземпляры изменяет их, следовательно, разбивая символы в вашем php-коде.

Весь этот код, как представляется, устарел , но измените java для вывода символов, закодированных utf-8:

 HttpParams httpParams = new BasicHttpParams(); HttpProtocolParams.setContentCharset(httpParams ,"UTF-8"); httpClient = new DefaultHttpClient(httpParams); httpPost = new HttpPost(params[0]); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8")); 

и удалите избыточность в вашем php:

 ini_set("default_charset", "UTF-8"); header('Content-type: text/html; charset=UTF-8'); mb_internal_encoding('UTF-8'); mb_http_input("utf-8"); 

Заголовок будет перезаписывать ini_set, поэтому вы можете удалить его, а http-вход уже находится в utf8 (поскольку мы просто изменили его в java), поэтому вы также можете удалить его:

 header('Content-type: text/html; charset=UTF-8'); mb_internal_encoding('UTF-8'); 

Используйте поле varchar базы данных как utf8_general_ci.

Если вы используете скрипт php для вставки данных в базу данных, сначала используйте функцию utf8_encode для данных, которые нужно вставить, а затем используйте utf8_decode на тех же данных, а затем выполните операцию вставки базы данных.