长话短说:我们有一个基于PHP5.x和MySQL的基于PHP的自主开发的CMS,它使用了utf8和iso-8859-1字符集的健康组合(不要判断,我知道这很奇怪,但它是有效的)。在我们的生产环境中,我们的服务器提供者升级到了PHP7.2,并且(经过几周的重构)一切都很好。
与此生产环境并行,我为我们的开发设置了一个测试环境,VirtualBox Ubuntu20.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 geE 217它只保存E 118eintrE 219。
不过,我可以在DB中手动保存ü,没有问题(不需要使用ü)
(我们有第二个开发服务器,Ubuntu14.04,apache2.4,PHP5.6,MySQL5.7,与PHP7.2测试服务器上的设置基本相同,一切正常)
也许PHP7.2在这里搞砸了,我真的想不出来了。
任何帮助都将不胜感激。谢谢
发布于 2020-09-24 19:39:26
参见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_%值。因此,将其更改为utf8mb4,不要以“根”的形式连接。
您确定导入数据中的编码吗?(我怀疑这会导致截断问题。)你能得到一小部分数据的十六进制转储吗?
对于西欧语言,MySQL的utf8和utf8mb4的工作原理是一样的。也就是说,您拥有的init_connect应该是足够的_if传入的数据实际上是UTF-8,而不是iso.
以下是十六进制值供参考:
char latin1 utf8
ä E4 C3A4
ü FC C3BChttps://stackoverflow.com/questions/64044286
复制相似问题