无法在mysql数据库中正确插入希腊字符

时间:2015-09-25 12:38:03

标签: php android mysql character-encoding http-headers

我们的mysql数据库在将数据从模拟器发送到mysql数据库时显示Î Î¿Î»Ï Î³Î»Ï…ÎºÏŒÏ代替希腊字符。其他字符保持不变。

来自phpMyAdmin的截图:

data

更新:

使用后

@FélixGagnon-Grenier在我的代码中回答它给了我:

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

爪哇

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

5 个答案:

答案 0 :(得分:6)

您的问题与您的charset编码有关。您的整个代码具有相同的字符集非常重要,以避免字符显示不正确的问题。

有很多设置需要正确定义,我强烈推荐使用UTF-8,因为这里有大多数你需要的字母(斯堪的纳维亚语,希腊语,阿拉伯语,俄语等)。

这里有一些必须设置为特定字符集的事项列表。

<强>接头

  • 将HTML和PHP标头中的字符集设置为UTF-8

    • PHP:

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

      (PHP标头必须放在任何输出之前(echo,空格, 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有不同的方法。

<强>数据库

  • 您的数据库及其表格必须设置为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 ++编写代码,可以在任务栏的“格式”下拉列表中完成。

<强>表情符号

  • 在MySQL(表,数据库和连接对象)中,如果您希望使用emojis,则需要指定utf8mb4字符集,而不是常规utf8

我对Java知之甚少,但是如果你也可以将属性设置为UTF-8,那就去做吧。实质上,可以设置为特定字符集的所有内容都应设置为相同。

如果你按照上面的所有指示,你的问题很可能会得到解决。如果没有,您可以查看此StackOverflow帖子:UTF-8 all the way through

答案 1 :(得分:1)

this blog中可以找到关于在PHP和Mysql中使用UTF8的优秀介绍。要点是:

  1. 将数据库表格设置为UTF8
  2. 在你的php.ini集jidStr
  3. 建立连接后,您可能必须运行以下命令/查询:senderId
  4. 我猜你错过了第3点。

    在PHP脚本中,您应该执行以下操作(未经测试):

    default_charset = "utf-8";

答案 2 :(得分: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
  •   

根据java constant field values

,http默认字符集为ISO-8859-1

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

答案 3 :(得分:0)

将数据库varchar字段用作utf8_general_ci。

答案 4 :(得分:0)

如果您使用php脚本将数据插入数据库,则首先对要插入的数据使用utf8_encode函数,然后对相同数据使用utf8_decode,然后执行数据库插入操作。