2015-09-25 8 views
5

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

скриншот из PhpMyAdmin:

data

UPDATE:

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

@ Феликса Gagnon-Гренье ответ в моем коде это дает мне это:

Database

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 

enter image description here

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(); 
?> 

Java

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; 
     } 
+0

Каков ваш набор символов в вашем столе? –

+0

utf8_general_ci –

+0

Используйте ISO-8859-1 для вашего набора символов. –

ответ

1

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

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

Я думаю, вам не хватает точки 3.

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

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

nope это не работает –

+0

Может быть, это только консоль регистрации, которая настроена на неправильную кодировку? Вы смотрели в базу данных по-другому (консоль или phpMyAdmin или что-то еще) – luksch

+0

да только от phpadmin –

0

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

+1

уже сделано, что –

6

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

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

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

Headers

  • Настройка кодировки символов в обоих 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 атрибута по. Другие MySQL-API имеют разные способы сделать это, если вы будете использовать что-то еще в будущем.

Database

  • Ваш база данные и его таблица должны быть установлены в 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.ини спецификация

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

    default_charset = "utf-8"; 
    

Файл кодирования

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

Emojis

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

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

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

+0

Я сделал все, что вы предлагаете, но все тот же –

+0

Я вижу, что вы обновили свой код после моего сообщения, но вы не включили 'charset = utf8' в свой объект соединения. Это только что осталось от кода, который вы обновили, или вы действительно имеете его в своем * фактическом * коде? @KostasDrakonakis – Qirel

+0

Я оставил его, но есть ли он или нет, он дает мне тот же результат –

1

Ваша вся настройка PHP/MySQL, кажется, закодированные с UTF-8, но код Java не является, начиная оттуда:

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

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

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

  • ContentCharset: HTTP.DEFAULT_CONTENT_CHARSET

НТТР по умолчанию набор символов ISO-8859-1 согласно java constant field values

HttpPost сам делает похоже, не смешиваются с наборами символов.

Но UrlEncodedFormEntity. Кроме того, из документации:

 
UrlEncodedFormEntity(Iterable parameters) 
Constructs a new UrlEncodedFormEntity with the list of parameters with the default encoding of 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'); 
+0

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

+0

Я попробую ваше решение .... кажется, хорошая попытка –

0

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

Смежные вопросы