java - PHP - MySQL - Java - 确保字符集统一

标签 java php mysql pdo utf-8

我遇到一个问题,我将一些文本从 java 程序发送到 PHP 页面,该页面将文本上传到 MySQL 数据库,然后我从 MySQL 数据库(通过另一个 PHP 页面)检索 java 程序中的文本)。问题是我认为 MySQL 数据库没有使用与 java 程序和 PHP 页面相同的字符集 (utf-8)。

当我将字符串“This is a super—long dash”发送到 PHP 页面时,它从 MySQL 数据库返回“This is a super—long dash”。

我知道第一个 PHP 页面正在接收正确的字符串,因为我使用“echo $_POST[xxx];”以确保。

我也使用这条线:

"mysql:host=$servername;dbname=$dbname;charset=utf8"

当创建PDO连接MySQL数据库时。

我检查了 MySQL 数据库,其中的字符串是“This is a superùlong dash”,这让我相信这一定是 MySQL 的问题,而不是 PHP 或 Java 的问题。

我尝试通过使用此处解决方案中的 fixUTF8 函数来纠正此问题: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;
?>

编辑2:

以下是SHOW CREATE TABLE 作者提供的内容:

enter image description here

最佳答案

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。对于一对 ALTER 中的单个表,您可以(应该)MODIFY 将所有必需的列修改为 VARBINARY

代码的修复是建立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

关于java - PHP - MySQL - Java - 确保字符集统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31717598/

相关文章:

java - 打开主页应用程序打不开

java - 使用 jaybird 选择结果的数据更改监听器

php - 在 php-header 的菜单中突出显示当前页面

php - 使用简单的类似查询获取数据问题

php - MySQL 文本格式

mysql - sql分组计算

java - 出于单元测试的目的,哪个内存中 Java 数据库最接近 MySQL 和 SqlServer?

java - 使用 Hibernate 和 Spring 创建 Blob

java - JSP 查询减表值

java - WSO2 ESB 不会将多部分文件转发到代理服务