编码地狱。Mysql、php和utf-8

编码地狱。Mysql、php和utf-8,php,mysql,encoding,utf-8,character-encoding,Php,Mysql,Encoding,Utf 8,Character Encoding,执行查询比较短语是件麻烦事。查看以下配置以了解我的问题 sql.sql create user "myStore"@"localhost" identified by "1234"; grant all privileges on myStore.* TO "myStore"@"localhost"; create database myStore character set utf8 collate utf8_general_ci; use myStore; create table

执行查询比较短语是件麻烦事。查看以下配置以了解我的问题


sql.sql

create user "myStore"@"localhost" identified by "1234"; grant all privileges on myStore.* TO "myStore"@"localhost";

create database myStore character set utf8 collate utf8_general_ci;

use myStore;

create table item (
    item_id integer not null,
    name varchar(60) not null,

    primary key (item_id)
);

alter table item engine=innodb default charset=utf8 collate=utf8_bin;

insert into item (item_id, name) values (0, "apple"), (1, "maça");
my.cnf

[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
mysql>显示“collation%”之类的变量

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
mysql>显示“character_set%”等变量

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
index.php

<?php
    try {
        header ('Content-Type: text/html; charset=utf-8'); 

        $mysqli = new mysqli ("localhost", "myStore", "1234", "myStore");

        if ($mysqli->connect_error) throw new exception ("Error (" . $mysqli->connect_errno . "). " . $mysqli->connect_error);

        $sql = $mysqli->prepare ("select item_id, name from item where name = '" . utf8_decode ("maça") ."'");

        if (! $sql) throw new exception ($mysqli->error);

        $sql->execute ();

        $sql->bind_result ($item_id, $name); 

        while ($sql->fetch ()) echo $item_id . " - " . utf8_encode ($name);

        $sql->close ();
    }
    catch (exception $e) {
        echo $e;
    }
?>

mysql>显示“character_set%”等变量

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
这些变量是特定于会话的。请在交互式
mysql
会话期间或从PHP调用
SETNAMES'charset\u name'
以确保在会话期间为您的客户机适当地设置了它们

mysql>显示“character_set%”等变量

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |

这些变量是特定于会话的。请确保在会话期间通过在交互式
mysql
会话期间调用
SETNAMES'charset\u name'
或从PHP为您的客户端适当设置它们。

您是否也将PHP源代码保存在utf8中?我不确定否决票是为了什么,所以我投票支持您。当然,每个文件都是utf-8:)你也用utf8保存了PHP源代码吗?我不确定否决票是为了什么,所以我把你投了赞成票。当然,每个文件都是utf-8:)谢谢你的帮助,但现在我很困惑。我正在寻找服务器端解决方案,该官员告诉我,这是一种更好的方式:s@Caio:我不太明白你所说的“服务器端解决方案”是什么意思。客户端可能使用与MySQL不同的字符串编码,因此必须执行翻译:这可能发生在MySQL中(通过通知它客户端编码,这是正常的方法),也可能发生在客户端中(这是您在上面所做的)。感谢您的帮助,但现在我感到困惑。我正在寻找服务器端解决方案,该官员告诉我,这是一种更好的方式:s@Caio:我不太明白你所说的“服务器端解决方案”是什么意思。客户机可能使用与MySQL不同的字符串编码,因此必须执行翻译:这可能发生在MySQL中(通过通知它客户机编码,这是正常的方法),也可能发生在客户机中(这就是上面所做的)。