突然间,我不得不使用这个充满大量数据的数据库,整个系统充满了编码问题。一些表是Latin1,其他表是UTF8,混合归类和utf8_encode()PHP转换都在文件中随机传播。这是一场噩梦,我正试图解决它。
好的,我已经创建了一个PHP脚本来更新整个schmere的字符集和整理。
<?php
include("vars.php");
$servername = DB_HOST;
$username = DB_USER;
$password = DB_PASS;
$dbname = DB_NAME;
$charset = "utf8";
$collation = "utf8_general_ci";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT CONCAT('ALTER TABLE `', TABLE_NAME,'` CONVERT TO CHARACTER SET ".$charset." COLLATE ".$collation.";')
AS MYSQL FROM INFORMATION_SCHEMA.TABLES;";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_row()) {
$conn->prepare($row[0])->execute();
echo $row[0] . " EXECUTED </br>";
}
echo "FINISHED.";
} else {
echo "0 results";
}
$conn->close();
?>
这里的问题是许多varchars存储如下:“OBRAGEN ENGENHARIAISONSTRUÇÃ?ES LTDA”,之前的开发人员因此而在多个文件上使用了utf8_encode()。为了达到标准,我删除了所有utf8_encode()转换,以便仅依赖于数据库。如何“utf8_encodely”转换数据库上的所有varchars?这可能吗?
答案 0 :(得分:1)
请勿使用utf8_encode()
。
使用mysqli_set_charset('utf8')
。那么来自MySQL的所有文本都会以utf8的形式出现在你面前。这就是它是在CHARACTER SET latin1
列还是其他列中。 MySQL进行转换。
然后确保您的客户端代码只认为 utf8。
任何显示机制都使用utf8。例如,HTML:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
快速检查表格中的内容...找到一些重音字符,然后执行
SELECT col, HEX(col) FROM tbl WHERE ...
对于CHARACTER SET latin1
列,它将显示1字节(2个十六进制),对于utf8,它将显示2字节(4个十六进制)。
ÇÕ
是ÇÕ
的Mojibake。这可能意味着......
SET NAMES latin1
(或set_charset('latin1')
或...)相关联。 (应该是utf8
。)CHARACTER SET utf8
,也可能不是<?xml version="1.0" encoding="UTF-8"?>
<products>
<product id="13849">
<name>product name</name>
</product>
</products>
,但应该是这样。如果您发现某个表的数据存储不正确,我们可以查看该数据。
答案 1 :(得分:0)
我认为你必须手动识别在latin1校对表中具有utf8编码内容的表字段。然后在下面的问题中更新像@ABS方法这样的字段,并由@Marcel Grolms提供示例。