MySQL Database import cause issue special characters (ě ř č ů)

MySQL Database import causing issue special characters (ě ř č ů)

提问人:admec986 提问时间:10/17/2022 最后编辑:admec986 更新时间:10/18/2022 访问量:785

问:

嗨,我最近更改了我网站的托管服务提供商。执行此操作时,我导出了之前的cpanel phpmyadmin中的mysql数据库。它有 CHARACTER SET latin1 和 COLLATE latin1_swedish_ci。将它导入到我的新 phpmyadmin 后,我发现显示用捷克语 ě ř č ů 书写的字符存在问题,这些字符显示为问号或奇怪的符号等。起初我也无法插入这些字母,但是在将表 CHARSET 更改为 utf8 后,我能够插入它们。但是,如何从旧数据库导出数据并将其导入新数据库而不会弄乱数据呢?数据库如下所示:

    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
    SET time_zone = "+00:00";
    
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
    
    --
    -- Database: `sambajiu_samba`
    --
    
    -- --------------------------------------------------------
    
    CREATE TABLE `bookings` (
      `id` int(11) NOT NULL,
      `fname` varchar(100) NOT NULL,
      `surname` varchar(100) DEFAULT NULL,
      `email` varchar(255) NOT NULL,
      `telephone` varchar(100) NOT NULL,
      `age_group` varchar(100) DEFAULT NULL,
      `hear` varchar(100) DEFAULT NULL,
      `experience` text,
      `subscriber` tinyint(1) DEFAULT NULL,
      `booking_date` varchar(255) DEFAULT NULL,
      `lesson_time` varchar(255) NOT NULL,
      `booked_on` datetime DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    ALTER TABLE `bookings` ADD PRIMARY KEY (`id`);

    ALTER TABLE `bookings` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=345;
MySQL 的UTF-8 phpMyAdmin ISO-8859-1

评论

0赞 Akina 10/17/2022
我导出了mysql数据库你到底是怎么做到的?你如何导入?
0赞 admec986 10/17/2022
我是用我的 cpanel phpmyadmin 中的导出按钮完成的。我做了同样的事情来将其导入我的新主机

答:

0赞 Rick James 10/17/2022 #1

捷克语不由 处理。最好使用(几乎可以处理世界上的所有事情)。在MySQL之外,它被称为“UTF-8”。latin1utf8mb4

你是如何做到“出口”和“进口”的?文件中有什么?你能得到导出文件的一小部分的十六进制吗 - 我们需要检查捷克语字符使用的编码。

至于“作为问号或奇怪的符号”,请参阅 UTF-8 字符的麻烦中的问号和 Mojibake; 我看到的不是我存储的。

你的十六进制可能想说

Rezervovat trénink zda

在六角形的中间是

C383 C2A9

这是 UTF-8 表示。当您显示数据时,您可能会看到该数据,或者您可能会看到所需的 .在后一种情况下,浏览器可能会通过两次解码数据来“帮助”您。有关此内容的进一步讨论,请参阅上面链接中的“双重编码”。éé

“修复数据”是相当混乱的:

 CONVERT(BINARY(CONVERT(CONVERT(
 UNHEX('52657A6572766F766174207472C383C2A96E696E6B207A6461') 
   USING utf8mb4) USING latin1)) USING utf8mb4)

==> 'Rezervovat trénink zda'

但是,我认为我们还没有完成。acute-e 是 latin1 中的有效字符。你提到了 4 个捷克口音的字母,我认为这些字母不是拉丁语1。Latin5 和 dec8 可能是相关的。

评论

0赞 admec986 10/17/2022
我使用phpmyadmin做到了。我在问题中添加了数据库的示例
0赞 Rick James 10/18/2022
@admec986 - 之前和之后都在桌子上吗?转储和加载是否有任何参数?在之前/之后与数据库的连接的默认字符集是什么?DEFAULT CHARSET=utf8;
0赞 admec986 10/18/2022
不,当我导入它时,它是 CHARSET=latin1,但由于这不允许以格式编写特殊字符,因此我将其更改为 utf8。然而,这并没有解决所有原始数据完全混乱的问题。我从中导入和导出到的两个phpmyadmin都具有服务器连接排序规则:utf8mb4_unicode_ci。我不认为我刚刚单击了导出或导入按钮的任何参数
0赞 Rick James 10/18/2022
对于少量数据,我可以帮助您确定损坏程度。 显示磁盘上的实际内容;所有的“字符集”线索都不太确定。SELECT col, HEX(col) FROM ... WHERE ...HEX()
0赞 admec986 10/18/2022
好的,所以我为一个名为 home_section_five 的表运行了这个:SELECT s5_btn1, HEX(s5_btn1) FROM home_section_five WHERE id=1;;;它返回 52657A6572766F766174207472C383C2A96E696E6B207A6461...