3

他の多くの人と同じように、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_ 関数に置き換える必要があることを知っています。しかし、うまくいけば、それはこの正確な問題とは何の関係もありません =)

4

1 に答える 1

0

ほとんどの場合、root アカウントを使用して MySQL にアクセスします。ドキュメントからのこの小さなスニペットは、あなたの決め手になるかもしれません。

前述のように、アプリケーションは接続後に SET NAMES または同等の機能を使用して接続を構成する必要があります。--init_connect="SET NAMES 'utf8'" オプションを使用してサーバーを起動し、接続するクライアントごとに SET NAMES が自動的に実行されるようにしたくなるかもしれません。ただし、SUPER 権限を持つユーザーに対しては init_connect 値が実行されないため、これは一貫性のない結果をもたらします。

于 2014-02-01T05:28:37.717 に答える