将MySQL默认字符集从Latin1更改为UTF8

3

我有PHP 5.5.9和MySQL 5.5.43 Innodb。这是在Kubuntu LTS /etc/mysql/my.cnf文件中

printf("当前字符集:%s\n",mysqli_character_set_name($conn));

当前字符集:latin1

我已经尝试过首先使用default-character-set = utf8,但我的mysql服务器无法重新启动。

然后我尝试了character-set-server = utf8,那么我的mysql shell就无法启动了。

我该如何解决这个问题?我已经通过init_connect ='SET NAMES utf8'来解决非root用户的问题,但字符集仍然保持不变(只有以非特权用户身份显示为UTF8,实际上还是Latin1)。

如果smnd能告诉我WHERE应该使用utf8mb4的话,那就太好了!还是在my.cnf文件中?我已经将我的表从utf8迁移到了utf8mb4...

另一个问题:这是否适用于Linux(Kubuntu)服务器:https://www.youtube.com/watch?v=3M1Wpw4uOoM

请帮助我,谢谢,来自lilaum.com的Gregor

2个回答

3

mysqli_set_charset('utf8')

init_connectroot 连接时被忽略。

utf8mb4 实际上是 utf8 的超集。它需要用于中文和新的表情符号,以及一些罕见的字符集。


能否一劳永逸地在全局范围内完成这个任务? - user1081168
utf8mb4才是真正的utf8……我之前认为需要在mysql中更改它,因为我之前已经将default_charset =“UTF-8”添加到php.ini中,但它没有起作用。如果(我相信可以)一劳永逸地在服务器全局更改此指令,请告知我,谢谢…… - user1081168
全局地...在 my.cnf 中,这 可能未来 的操作建立 utf8mb4:character_set_server=utf8mb4 如果您有现有数据,则需要以其他方式处理。 - Rick James

2

PHP手册中说:

MySQLnd 始终假设服务器使用默认字符集。在连接握手/身份验证期间发送此字符集,mysqlnd 将使用它。

MySQLnd 是 PHP 5.4 及以上版本中包含的 MySQL 原生驱动程序。

不幸的是,在我的系统中(Debian Jessie 8.3上的PHP 5.6.17和MySQL 5.5.47),尽管已经配置了/etc/mysql/my.cnf具有以下条目,我必须确认:

[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

mysqlnd似乎不会默认假定服务器的字符集(utf8),而是将连接字符集设置为latin1,并使用排序规则latin1_swedish(考虑到MySQL AB是一家瑞典公司,这可能是默认值)。

因此,当从PHP应用程序连接时,似乎没有永久设置utf8字符集的方法。您必须调用

$mysqli->set_charset("utf8")

每次连接后都要关闭数据库连接。这可以嵌入到自定义的“dbconnect” PHP函数中,以提供一种抽象层。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接