我遇到的问题是我将一些文本从java程序发送到PHP页面,然后将文本上传到MySQL数据库,然后我从MySQL数据库中检索java程序中的文本(通过另一个PHP页面) )。问题是我认为MySQL数据库没有使用与java程序和PHP页面相同的字符集(utf-8)。
当我将字符串“This is a super-long dash”发送到PHP页面时,它从MySQL数据库返回“这是一个超级短划线”。
我知道第一个PHP页面正在接收正确的字符串,因为我使用“echo $ _POST [xxx];”确保。
我也使用这一行:
"mysql:host=$servername;dbname=$dbname;charset=utf8"
创建PDO以连接MySQL数据库时。
我检查了MySQL数据库,字符串中有“这是一个超级短划线”,这让我相信它一定是MySQL的问题,而不是PHP或Java。
我试图通过在解决方案中使用fixUTF8函数来解决这个问题:SebastiánGrignoli的Detect encoding and make everything UTF-8。然而,结果我得到“这是一个超级长的冲刺”。
修改
这是我上传到MySQL的PHP代码:
<?php
$servername = "**********";
$username = "**********";
$password = "**********";
$dbname = "**********";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("INSERT INTO authors (first_name, middle_name, last_name, blurb)
VALUES (?, ?, ?, ?)");
$stmt->execute(array("$_POST[firstName]", "$_POST[middleName]", "$_POST[lastName]", "$_POST[blurb]"));
echo "New author created successfully";
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
EDIT2:
以下是SHOW CREATE TABLE authors
提供的内容:
答案 0 :(得分:0)
当super—long
出来super—long
时,你有Mojibake。
这是
的经典案例SET NAMES latin1
(或set_charset('latin1')
或...)相关联。 (应该是utf8
。)CHARACTER SET latin1
。 (或者它可能是从表/数据库继承的。)(应该是utf8
。)修复数据是“两步更改”。
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;
其中长度足够大而另一个“......”还有其他任何内容(NOT NULL
等)已经在列上。
不幸的是,如果您要使用很多列,则需要很多ALTER。对于MODIFY
对中的单个表,您可以({should} VARBINARY
ALTERs
所有必要的列。
修复代码是将utf8建立为连接;这取决于PHP中使用的api。 ALTERs
将更改列定义。
How to avoid Junk/garbage characters while reading data from multiple languages? http://mysql.rjweb.org/doc.php/charcoll#how_mangling_happens_on_insert