PHP - MySQL - Java - 确保字符集一致性

时间:2015-07-30 07:26:06

标签: java php mysql pdo utf-8

我遇到的问题是我将一些文本从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提供的内容:

enter image description here

1 个答案:

答案 0 :(得分:0)

super—long出来super—long时,你有Mojibake。

这是

的经典案例
  • 客户端中的字节在utf8(正常)中正确编码。
  • 您可能默认与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