问题描述
长话短说:我们有一个基于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=utf8mb4
和character_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的utf8
和utf8mb4
的工作原理相同。也就是说,如果输入的数据确实是UTF-8,而不是iso ...,那么您拥有的init_connect
应该足够了。
十六进制值供参考:
char latin1 utf8
ä E4 C3A4
ü FC C3BC