3

MariaDB クライアントに UTF-8 を使用させるにはどうすればよいですか? 同等バージョンの MySQL ではこの問題は発生しません。 クライアント経由で発行せずにこれを実行しようとしています。SET NAMES cmd ライン クライアントと php の mysqli ドライバーで latin1 を取得します。

PHP mysqli_get_charset:

print_r(mysqli_get_charset($link));
stdClass Object
(
    [charset] => latin1
    [collation] => latin1_swedish_ci
    [dir] => 
    [min_length] => 1
    [max_length] => 1
    [number] => 8
    [state] => 1
    [comment] => 
)

コマンド ライン クライアントからの出力は次のとおりです。

echo "show variables like 'char%';" | mysql -u root -p

Variable_name   Value
character_set_client    utf8
character_set_connection        utf8
character_set_database  latin1
character_set_filesystem        binary
character_set_results   utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir      /usr/share/mysql/charsets/

これが私の my.cnf ファイルです。

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock
default-character-set=utf8
[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0
default-character-set=utf8
[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
default-character-set  = utf8
default-collation      = utf8_general_ci
character_set_server   = utf8
collation_server       = utf8_general_ci
init_connect='SET NAMES utf8'
key_buffer              = 512M
max_allowed_packet      = 64M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
query_cache_limit       = 4M
query_cache_size        = 64M
expire_logs_days        = 10
max_binlog_size         = 100M
[mysqldump]
quick
quote-names
max_allowed_packet      = 64M
default-character-set=utf8
[mysql]
no-auto-rehash  # faster start of mysql but no tab completition
default_character_set=utf8
[isamchk]
key_buffer              = 128M
[client-server]
default-character-set=utf8
[client-mariadb]
default-character-set=utf8
!includedir /etc/mysql/conf.d/
4

2 に答える 2

1

私は問題を理解しました。リポジトリと apt-get を使用して mariadb をインストールしました。すべてがうまくいくように見えました。service mysql restartコマンドとエンコードの問題を使用して、これらの非常に遅い再起動がありました。mysqld のインスタンスが 2 つあることに気付きました。先に進み、kill コマンドを送信しました。kill -9 はお勧めしません。通常の kill は問題なく機能しました。その後service mysql restart、すぐに開始し、文字エンコーディングは期待どおりに機能しました。

于 2013-05-07T15:33:22.793 に答える
1

問題は、とにかくクライアント経由で発行しないことです。SET NAMES
このコマンドでは不十分なため、サーバーのほかにクライアントのエンコーディングも設定する必要があります。そして、これは API 関数を使用するだけで実現できます。そのため、クエリを発行する代わりに、PHP スクリプトで関数または DSNSET NAMESを使用してクライアント エンコーディングを設定する必要があります。msql(i)_set_charset()

したがって、覚えておいてください - デフォルトのエンコーディングを変更しても、PHP でエンコーディングを設定する必要がなくなるわけではありません。

それにもかかわらず、utf-8よりもデフォルトの方が理にかなっていますlatin1。したがって、次の行をセクションmy.iniの下に追加します[mysqld]

init-connect='SET NAMES utf8'
于 2013-04-13T05:40:33.937 に答える