Невозможно правильно вставить греческие символы в базу данных 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; } 

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

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

Существует довольно много настроек, которые необходимо правильно определить, и я настоятельно рекомендую 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 на тех же данных, а затем выполните операцию вставки базы данных.