0

Performing a query comparing phrases is a pain in the ass. Look the following configuration to understand my problem.


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> SHOW VARIABLES LIKE 'collation%';

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

mysql> SHOW VARIABLES LIKE 'character_set%';

+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

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

As you can see, I MUST decode the string before sending it to MySQL and then encode it again.

I really don't know what is wrong, is there a way to avoid those encoding and decoding functions ? Thanks.

3
  • Did you also save the PHP source in utf8? Commented Sep 8, 2012 at 1:38
  • I'm not sure what the down vote was for, so I voted you up. Commented Sep 8, 2012 at 1:43
  • Sure, every single file is utf-8 :) Commented Sep 8, 2012 at 17:03

1 Answer 1

3

mysql> SHOW VARIABLES LIKE 'character_set%';

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |

These variables are session-specific. Please ensure that they are set appropriately for your client during your sessions by calling SET NAMES 'charset_name' during an interactive mysql session, or mysqli::set_charset ( string $charset ) from PHP.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for your help but now I'm confused. I was looking for a server-side solution and the official website tells that this is the preferable way :s
@Caio: I'm not sure I understand what you mean by "a server-side solution". Clients may use a different string encoding to that used by MySQL, so translations must be performed: this can occur either in MySQL (by informing it of the client encoding, which is the normal approach) or else within the client (which is what you're doing above).

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.