转换数据库

时间:2015-10-24 14:46:41

标签: php mysql

我有一个数据库,其中有一个表格,其中有一个名为' name'

的列

以此名称为例,我有一个具有以下值的字段: 대한민국•KOREA

要填充我的表,我必须使用一个99K行大的SQL文件,并且填充了这样的字段......

现在有什么方法可以让我的PHP脚本工作,这样它就能给出我需要的字符实际表示形式대한민국•KOREA

我已检查过我的服务器配置。 Apache,PHP,mysql都是utf-8设置并准备就绪......

更新

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE IF NOT EXISTS `activeclans` (
  `id` bigint(11) NOT NULL,
  `name` text CHARACTER SET utf8 NOT NULL,
  `location` text CHARACTER SET utf8 NOT NULL,
  `playercount` int(11) NOT NULL,
  `clanlevel` int(11) NOT NULL,
  `score` int(11) NOT NULL,
  `warswon` int(11) NOT NULL,
  `warslost` int(11) NOT NULL,
  `warstied` int(11) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

--
-- Daten für Tabelle `activeclans`
--

INSERT INTO `activeclans` (`id`, `name`, `location`, `playercount`, `clanlevel`, `score`, `warswon`, `warslost`, `warstied`) VALUES
(1669110, '벽치는 골렘들 #.#', 'South Korea', 48, 6, 21589, 44, 18, 1),
(1707076, 'THE HURRIKANEZ', 'International', 29, 5, 20241, 39, 17, 3),
(1710048, '+WARLORDS+', 'India', 42, 3, 20700, 5, 49, 0),
(1748604, 'الحجايا', 'Jordan', 40, 4, 21218, 27, 13, 2),
(1749793, 'Vindicaâž•ed', 'International', 50, 5, 22212, 32, 18, 4),
(1755056, 'Hunter hogs 101', 'United States', 44, 3, 20501, 5, 23, 2),
(1761757, 'دعم وحرب', 'Saudi Arabia', 45, 1, 22373, 0, 7, 0),
(1764157, 'tiwi warriors', 'Morocco', 49, 5, 21663, 36, 13, 3),
(1785753, 'INCAUDA VENENUM', 'France', 41, 4, 20412, 25, 8, 1),
(1797817, 'QUEENofURAGONs', 'Philippines', 49, 5, 24104, 38, 8, 1),
(1829886, 'Max clasher', 'Philippines', 43, 5, 20076, 32, 12, 0),
(1837025, 'DUCATO ACCADEMY', 'Italy', 38, 3, 22227, 12, 12, 1),
(1845435, 'shoook tower', 'Iran', 44, 4, 21531, 30, 10, 0),
(1876715, '無言', 'Japan', 48, 4, 20178, 5, 25, 0),
(343597774219, 'CLASH O'' TRASH', 'United States', 46, 1, 20790, 0, 0, 0);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

这是Sql文件的一部分。

我与Db的关系如下:

<?php
$con = new mysqli("localhost", "beep", "beep", "beep");

if ($con->connect_errno) {
    printf("Connect failed: %s\n", $con->connect_error);
    exit();
}
?>

我有这个用于显示数据:

$table = "
<table border='1' align='center' cellspacing='3' cellpadding='3' style='border-collapse:collapse;'>
    <tr>
        <td>Clan ID</td>
        <td>Clan Name</td>
        <td>Location</td>
        <td>Player Count</td>
        <td>Clan Level</td>
        <td>Score</td>
        <td>Wars Won</td>
        <td>Wars Lost</td>
        <td>Wars Tied</td>
    </tr>";


$clanResultQuery = "SELECT * FROM activeclans ORDER BY score DESC LIMIT 100";

if($activeClansResult = mysqli_query($con,$clanResultQuery)){
    while($row = mysqli_fetch_array($activeClansResult)){
        $table .="
        <tr>
            <td>".$row['id']."</td>
            <td>".$row['name']."</td>
            <td>".$row['location']."</td>
            <td>".$row['playercount']."</td>
            <td>".$row['clanlevel']."</td>
            <td>".$row['score']."</td>
            <td>".$row['warswon']."</td>
            <td>".$row['warslost']."</td>
            <td>".$row['warstied']."</td>
        </tr>";
    }
}

$table .= "</table>";

1 个答案:

答案 0 :(得分:0)

你的角色设置搞砸了。您的数据位于latin1 (Windows-1252),但MySQL认为它是UTF-8

在过去,使用UTF-8的系统使用latin1字符集连接到MySQL的可能性更大,这就是最初混合的原因。

每当连接到MySQL实例时,如果客户端通知MySQL它使用的字符集和排序规则,它会有所帮助。

SET NAMES utf8;

当您尝试迁移数据库时,请将其保留,并且您可能处于痛苦的世界。

要修复数据,您需要导出,重新替换并重新导入数据 - 在尝试使用实时服务器之前,请始终在备份上进行测试!这适用于大多数基于Linux的系统。

mysqldump -u _USER_ -h _HOST_ -p --add-drop-table  --default-character-set=latin1 _DNNAME_  > mydata.sql

sed -i -e 's/CHARSET=latin1/CHARSET=utf8/ig' -e 's/latin1_bin/utf8_bin/ig' -e 's/latin1_swedish_ci/utf8_general_ci/ig' -e 's/SET NAMES latin1/SET NAMES utf8/ig' -e 's/CHARACTER SET latin1/CHARACTER SET utf8/ig' mydata.sql

mysql -u _USER_ -h _HOST_ -p  _DNNAME_< mydata.sql 

命令的作用是将数据库转储到其现有形式 - latin1中。然后使用sed将所有关于数据字符集的陈述从latin1替换为utf-8。导入时,MySQL现在将数据视为utf-8并显示为此类。记得首先测试副本,字符集问题可能很难完全解决。

完成所有操作后,请确保在连接MySQL后使用set names命令通知服务器您的客户端正在使用哪个字符集。