我有一个PHP表单,可将数据提交给MySQL。
查看数据库中的数据,我可以看到大约2-3%的行包含国际字符,这些国际字符的编码不正确,例如“Guðrún”显示为“Guðrún”。
但是,另一位用户可能会在几分钟后提交相同的字符,在这种情况下,字符已正确编码
因此,编码似乎取决于所使用的计算机或我不知道的其他因素。
在HTML的开头,我有这个:
<form autocomplete="on" method="post" action="index.php" id="form1" accept-charset="ISO-8859-1">
表单具有以下内容:
xAxes: [{
display: true,
position: 'bottom',
ticks: {
autoSkip: true
}
}]}
MySQL列设置为latin1_swedish_ci。
还有什么我需要做的事情才能使每个人都可以使用吗?
编辑:由于已被标记为重复 我在其他任何地方都找不到这个问题的答案。我已经阅读了很多有关字符编码的信息,这使我拥有了当前的设置,但这并不能解释为什么2-3%的数据与其余数据的行为有所不同。
答案 0 :(得分:0)
这种类型的错误称为Mojibake。 here
讨论了其原因但是...您似乎暗示某些行具有Mojibake,而其他行具有很好的重音字符?如果是这种情况,那就是客户端错误-一些客户端使用latin1,一些客户端使用utf8。在此级别混合不好。
但是,如果您以这种方式混合使用,请确保每个客户端都宣布适合其字节的CHARACTER SET
。最好通过连接参数来完成,但是也可以通过SET NAMES ...
来完成。这是some rambling notes on PHP
由于eth
中确实存在latin1
和u-acute,因此表列和/或客户端可能设置为latin1或utf8mb4的可能性很大,您可以考虑将utf8移至面向未来的数据库。
“来回更改”可能很危险-尤其是如果您使用“错误” ALTER
。请提供SELECT col, HEX(col) ...
。 Guðrún
的十六进制:
if latin1: 47 75 F0 72 FA 6E
if utf8/utf8mb4: 47 75 C3B0 72 C3BA 6E
if 'double encoded': 47 75 C383 C2B0 72 C383 C2BA 6E