如何将utf8_encode()或类似内容应用于数据库上的所有VARCHAR? (PHP / MySQL)

时间:2015-11-26 02:33:30

标签: php mysql encoding

突然间,我不得不使用这个充满大量数据的数据库,整个系统充满了编码问题。一些表是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?这可能吗?

2 个答案:

答案 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。这可能意味着......

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

MySQL - Convert latin1 characters on a UTF8 table into UTF8