【问题标题】:MariaDB clients to use UTF-8 by defaultMariaDB 客户端默认使用 UTF-8
【发布时间】:2013-04-12 22:56:30
【问题描述】:

如何让 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/

【问题讨论】:

标签: mysql mariadb


【解决方案1】:

问题是,无论如何你都不应该通过客户端发出SET NAMES
因为这个命令是不够的,除了服务器你还必须设置客户端编码。这只能通过使用 API 函数来完成。因此,与其发出SET NAMES 查询,不如在您的PHP 脚本中通过msql(i)_set_charset() 函数或DSN 设置客户端编码。

所以,请记住 - 更改默认编码不会让您摆脱在 PHP 中设置编码的必要性。

尽管如此,utf-8 作为默认值比latin1 更有意义。因此,在my.ini[mysqld] 部分下添加以下行

init-connect='SET NAMES utf8'

【讨论】:

  • 我认为您没有理解这个问题。 Maria 没有按预期使用指令。我不想通过客户端使用 SET NAMES,因为我有多个数据库驱动程序到不同的服务器,这些服务器已初始化但并不总是使用,因此发出该查询是一种浪费。 mysqli_set_charset 仍然执行 SET NAMES,我意识到它也设置了客户端编码,但如果设置正确,客户端编码默认为 utf8。我有你在 my.cnf 中提到的 init-connect 语句作为最后的努力,仍然没有工作。无论如何,我按照我的回答中的描述弄清楚了。
【解决方案2】:

我发现了问题所在。我使用他们的 repo 和 apt-get 安装了 mariadb。一切似乎都很顺利。我使用命令service mysql restart 以及编码问题进行了这些非常慢的重启。我注意到有 2 个 mysqld 实例,我继续发送了一个 kill 命令,我不推荐 kill -9,常规 kill 工作得很好。然后做了service mysql restart,启动很快,字符编码按预期工作。

【讨论】:

  • 我的一台服务器也遇到了同样缓慢的service mysql restart 问题。阅读您的答案后修复它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多