他の多くの人と同じように、mysql の文字セットに問題があります。他の多くの人と同じように、すべてを UTF-8 にしたいのですが、mysql は latin-1 でインストールされており、mysql 構成でどのように/google/experiment しても、クライアント設定にはまだ latin-1 が潜んでいます。
さて、これがセットアップです。パスワード 'pwd' を持つ (root 以外の) mysql ユーザー 'usr' がいます。ターミナル (mysql -uusr -p) 経由で mysql にアクセスし、彼の文字セットについてうまく尋ねると、彼は utf8 に恋をしていると答えます (そうあるべきです)。
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
ただし、PHP を使用して mysql にアクセスする場合 (まったく同じユーザーを介して):
$mysql_link=mysql_connect('localhost','usr','pwd');
$result1=mysql_query("show variables like 'character%'");
$result2=mysql_query("show variables like 'collation%'");
mysql_close($mysql_link)
そして print_r $result1, $result 2, それは魔法のように latin-1 にフォールバックします:
character_set_client => latin1
character_set_connection => utf8
character_set_database => utf8
character_set_filesystem => binary
character_set_results => latin1
character_set_server => utf8
character_set_system => utf8
character_sets_dir => /usr/share/mysql/charsets/
collation_connection => utf8_unicode_ci
collation_database => utf8_general_ci
collation_server => utf8_unicode_ci
これは、ブラウザ経由で (php-cgi として) php を呼び出すか、ターミナル経由で (php-cli として) php を呼び出すかに関係なく発生します。
そのためのちょっとした修正は、接続ごとに手動で文字セットを設定することです:
mysql_set_charset('utf8',$mysql_link);
それはうまくいきます。しかし、mysql configを介してそれを行う方法があるはずだと思います。
参考までに、Mysql 構成 (my.cfg) には以下が含まれます。
[client]
default_character_set = utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci
そしてPHP構成(php.ini)には含まれています
default_charset = "utf-8"
よろしくお願いします!=)
PS mysql_ 関数は非推奨であり、mysqli_ 関数に置き換える必要があることを知っています。しかし、うまくいけば、それはこの正確な問題とは何の関係もありません =)