MySQL 5.7 character_set_client堆栈位于utf8mb4

问题描述

长话短说:我们有一个基于PHP的自行开发的CMS,最初是在PHP5.x和MySQL上使用的,结合使用了utf8和iso-8859-1字符集的健康组合(不要判断,我知道这是很奇怪,但是可以正常工作)。在我们的生产环境中,我们的服务器提供程序已升级到PHP7.2,并且(经过几周的重构)一切正常。

与这个生产环境平行,我已经为我们的开发设置了(或至少尝试过)测试环境,即VirtualBox Ubuntu 20.04,apache2.4,PHP7.2和MySQL5.7。

/etc/php/7.2/apache2/php.ini 中,我有:

default_charset = "iso-8859-1"

/etc/mysql/my.cnf 中,我有:

[client]
default-character-set   = utf8


[mysqld_safe]
default-character-set   = utf8

[mysql]
default-character-set   = utf8


[mysqld]
init_connect                   = 'SET NAMES utf8'
character-set-client-handshake = false #force encoding to uft8
character-set-server           = utf8
collation-server               = utf8_unicode_ci

现在,在我们的开发服务器上的character_set_client=utf8mb4character_set_results=utf8mb4上,我找不到改变它的方法。

问题是,当我尝试从生产服务器(通过CMS)导入开发服务器上的转储时,或者当我尝试保存带有特殊字符(如üä,它总是在出现时剪断单词,仅保留其余单词,例如代替chüd只会保存 ch ,或者代替einträge只会保存 eintr

但是,我可以在数据库中手动保存ü,而不会出现问题(不必使用ü

(我们有第二个开发服务器,Ubuntu 14.04,apache2.4,PHP5.6,MySQL5.7,并且与PHP7.2测试服务器上的设置基本相同,并且一切正常)

也许PHP7.2在这里搞得一团糟,我真的没有主意。

任何帮助将不胜感激。谢谢

解决方法

请参见Trouble with UTF-8 characters; what I see is not what I stored中的“截断”

我想知道是否未将Apache设置为UTF-8搞乱了<form>s

init_connect = 'SET NAMES utf8'设置3个CHARACTER_SET_%(如果您未以“ root”身份连接)。因此,将其更改为utf8mb4,并且不要以“ root”身份连接。

您确定导入数据中的编码吗? (我怀疑这会导致截断问题。)能否将一小部分数据进行十六进制转储。

对于西欧语言,MySQL的utf8utf8mb4的工作原理相同。也就是说,如果输入的数据确实是UTF-8,而不是iso ...,那么您拥有的init_connect应该足够了。

十六进制值供参考:

char latin1 utf8
ä    E4     C3A4
ü    FC     C3BC

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...