No se puede insertar correctamente caracteres griegos en la base de datos mysql

Nuestra base de datos mysql muestra Î Î¿Î»Ï Î³Î»Ï…ÎºÏŒÏ en lugar de caracteres griegos mientras envía datos de un emulador a una base de datos mysql. Otros caracteres se dejan bien.

Captura de pantalla de phpMyAdmin:

datos

ACTUALIZAR:

Después de usar

@ Félix Gagnon-Grenier respuesta en mi código me da esto:

Base de datos

Sql para la creación de tablas

 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 

Introduzca aquí la descripción de la imagen

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

Su problema está relacionado con su charset-encoding. Es importante que todo el código tenga el mismo conjunto de caracteres para evitar problemas en los que los caracteres se muestren incorrectamente.

Hay bastantes ajustes que necesitan ser definidos correctamente y recomiendo encarecidamente UTF-8, ya que esto tiene la mayoría de las cartas que usted necesita (escandinavo, griego, árabe, ruso, etc.).

Aquí hay una pequeña lista de cosas que tiene que ser configurado para un conjunto de caracteres específico.

Encabezados

  • Establecer el conjunto de caracteres en HTML y encabezados PHP a UTF-8

    • PHP:

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

      (Los encabezados PHP tienen que colocarse antes de cualquier salida (eco, espacio en blanco, HTML)!)

    • HTML:

       <meta charset=utf-8" /> 

      (Los encabezados HTML se colocan dentro de la etiqueta <head> / </head> )

Conexión

  • También es necesario especificar el conjunto de caracteres en la conexión misma . Para su ejemplo PDO, se hace así

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

    Tenga en cuenta el charset=utf8 -attribute. Otras API de MySQL tienen diferentes maneras de hacer esto si usas algo más en el futuro.

Base de datos

  • Su base de datos y sus tablas tiene que estar en UTF-8. Tenga en cuenta que charset no es lo mismo que collation. Ya veo que ya estableció su clasificación en UTF-8, por lo que es bueno, pero hacer lo mismo para toda la base de datos y todas las tablas.

    Puede hacerlo ejecutando las consultas siguientes una vez para cada base de datos y tablas (por ejemplo, en phpMyAdmin)

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

    Tenga en cuenta que cualquier dato ya almacenado en la base de datos no tendrá automáticamente su conjunto de caracteres roto fijo. Por lo tanto, es importante que lo haga antes de insertar datos, o que vuelva a insertarlo después de configurar el conjunto de caracteres.

Especificación php.ini

  • En su archivo php.ini , debe especificar el conjunto de caracteres predeterminado para su plataforma, como este

     default_charset = "utf-8"; 

Codificación de archivos

  • También es importante que el archivo .php sí sea UTF-8 codificado. Si está usando Notepad ++ para escribir su código, esto puede hacerse en el menú desplegable "Formato" de la barra de tareas.

Emojis

  • En MySQL (tanto en la tabla, base de datos y conexión-objeto), tendrá que especificar el utf8mb4 caracteres utf8mb4 , en contraposición a utf8 regular, si desea trabajar con emojis.

No sé mucho acerca de Java, pero si puede establecer los atributos de UTF-8 allí también, hacerlo. En esencia, todo lo que se puede establecer en un conjunto de caracteres específico debe establecerse en el mismo.

Si usted sigue todos los punteros arriba, es probable que su problema será resuelto. Si no, usted puede echar un vistazo a esta StackOverflow post: UTF-8 todo el camino .

Una excelente introducción sobre el uso de UTF8 con PHP y Mysql se puede encontrar en este blog . Los puntos principales son:

  1. Establezca las tablas de base de datos en UTF8
  2. En su conjunto php.ini default_charset = "utf-8";
  3. Una vez establecida la conexión, es posible que tenga que ejecutar el comando / consulta siguiente: set names UTF-8;

Supongo que le falta el punto 3.

En tu script PHP, deberías hacer algo como esto (no probado):

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

Su conjunto php / mysql configuración parece estar codificado con utf-8, pero el código java no es, a partir de ahí:

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

En primer lugar, la clase DefaultHttpClient parece estar obsoleta. Sin embargo, los docs dicen que

Esta clase configura los siguientes parámetros si no se establece explícitamente:

  • ContentCharset: HTTP.DEFAULT_CONTENT_CHARSET

El conjunto de caracteres predeterminado de HTTP es ISO-8859-1 acuerdo con los valores de campo de constante de java

El HttpPost sí no parece mezclarse con juegos de caracteres.

Pero el UrlEncodedFormEntity hace. También de los documentos:

 UrlEncodedFormEntity (Parámetros iterables)
 Construye un nuevo UrlEncodedFormEntity con la lista de parámetros con la codificación por defecto de HTTP.DEFAULT_CONTENT_CHARSET

Dado que ISO-8859-1 no puede mantener caracteres griegos, pasarlos a través de esas instancias los modificará, por lo tanto, romper los caracteres en su código php.

Todo este código parece ser obsoleto , pero cambiar java a la salida utf-8 caracteres codificados:

 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")); 

Y eliminar la redundancia en su 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"); 

El encabezado sobrescribirá el ini_set, así que puedes quitarlo, y la entrada http ya está en utf8 (ya que solo lo transformamos en java), así que puedes eliminarlo también:

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

Utilice el campo varchar de la base de datos como utf8_general_ci.

Si está utilizando un script php para insertar datos en una base de datos, utilice utf8_encode función utf8_encode en los datos a insertar y luego utf8_decode en los mismos datos y luego realice la operación de inserción de la base de datos.

  • Problema con la carga de imagen de Android a Mysql
  • Cómo hacer json api
  • Proteger la secuencia de comandos de bots y las solicitudes no deseadas que publican datos
  • Conectando MySql con Android sin usar PHP
  • Cómo construir un servidor de notificación push de Android en PHP
  • Android: mensajes de alta prioridad con la mensajería en la nube de google (con corona sdk)
  • ¿Cómo debo manejar los tiempos de espera del servidor y las respuestas de código de error a una entrada de http en la aplicación para Android?
  • Cómo difundir la referencia a la aplicación de Android
  • Cross Platform Aplicación: Android + Custom REST Backend (Yii2) + Proveedor SSO de terceros para iniciar sesión (Google+)
  • Caracteres especiales entre Android y PHP
  • 'Navegación bloqueada' al abrir Intención
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.