MySQL 表包含 latin1 但定义为 UTF8,字符编码地狱

MySQL 表包含 latin1 但定义为 UTF8,字符编码地狱

我“继承”了 osCommerce 2.2、PHP4 和 MySQL4 设置,这会带来麻烦。问题在于字符编码。虽然表定义为包含,但UTF8它们实际上包含latin1。为了将全新的东西混入其中,似乎老程序员通过设置SET CHARACTER SET 'utf8'何时建立与数据库的连接来手动更改了这一点。

现在看起来像这样:

  • MySQL的: UTF8但实际上包含latin1
  • PHP的:MySQL-Connection 手动设置为UTF8
  • HTML:ISO-8859-1以aka形式交付latin1

这种设置一直有效,直到一周前供应商更换某物(他们实际上否认接触过数据库或任何其他东西,但他们的服务器出现了问题)。

问题在于德语特殊字符öäüß显示正确,但是当您想将它们插入数据库时​​,整个 osCOmmerce 会话就会中断,只显示插入该字符之前的文本。

  • 要插入的文字:Das _ä_ ist ein Umlaut
  • 保存的文本:Das _

当我通过将字符集设置为latin1在建立连接时来更改手动入侵时,每次插入都没有问题,但数据库只会传递?特殊字符。

我不知道如何解决这个问题,如果我将数据库列更改为,latin1我会丢失所有特殊字符,如果我更改连接上的编码,则显示或插入都会失败。我完全没有主意了。

答案1

当您更改其他字符集中的数据时,您必须先将其更改为 blob,然后再更改为目标字符集 (latin1)。如果您不这样做,mysql 将为您进行转换,而您不想这样做,因为您已经获得了 latin1 中的数据?

据我所知,当您在连接(即 php)中使用设置字符集时,mysql 会自动将表中的所有数据转换为连接的字符集。

答案2

虽然不太优雅,但通常可以解决问题:

  1. 将整个数据库转储到 SQL 文件 - 检查文本文件中是否有正确的编码,
  2. 修复表查询,创建 UTF-8 表
  3. 检查数据库的设置 - 使用 UTF-8
  4. 再次导入整个数据库

相关内容