我遇到一个问题,我将一些文本从 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 作者
提供的内容:
最佳答案
当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/