【问题标题】:How to remove or convert non UTF 8 / UTF-8 characters from a MySql column如何从 MySql 列中删除或转换非 UTF 8 / UTF-8 字符
【发布时间】:2013-03-21 16:12:25
【问题描述】:

我在 MySql 5 DB 上有一个表。该表包含不是有效 UTF-8 / UTF8 的数据。

字段的数据类型为LONGTEXT

以下是此类数据的示例:

receiver?àùs 

我尝试通过多种方式转换和更改字符集:

ALTER TABLE Table1 CONVERT TO CHARACTER SET utf8;

ALTER TABLE Table1 convert to character set utf8 collate utf8_general_ci;

ALTER TABLE Table1 CHANGE `col1` `col1` LONGTEXT CHARACTER SET utf8;

更改表后,我尝试从包含该数据的另一个表中重新加载它,但它没有改变......它看起来像“receiver?àùs”而不是 UTF 8 字符。

如何转换?

【问题讨论】:

  • 列中的所有字符都已编码为 UTF-8。这是数据如何插入表中的问题,表中已经存在的数据通常是无法挽救的,尤其是当您有 ? 字符时,这意味着信息丢失。当您将数据插入表中时,您需要以与您声称对 mysql 相同的编码对物理字节进行编码。声称的编码是连接编码。物理编码取决于。如果您使用的是 PHP,驱动程序不会强制执行任何物理编码。
  • 在将数据推送到数据库之前,我在 php 中使用了 mb_convert_encoding。这对我来说就像魅力
  • 我不介意丢失非 UTF-8 数据。我只需要在 MySql 中找到一种将其转换为 UTF-8 的方法。后来我将其导出,当我尝试将其导入到第 3 端程序时,问题就开始了。我想我可以用 php 做点什么,但我宁愿避免它,我有 1,000,000 多条记录。
  • @cjg 您可以正确声明连接编码,而不必这样做...
  • @cjg 如果您不知道文件的编码是什么,您如何转换它们?转换需要解码($from 部分),如果您不知道在解码中使用什么编码,则无法正确解码。 :P

标签: mysql utf-8 casting


【解决方案1】:

这解决了我的问题:

select convert(binary convert(`Table1`.`col1` using latin1) using utf8) 
FROM `Table1`

后来我更新了表格 - 我丢失了一些数据,但我不介意。大部分都留下了。

更新查询如下:

Update Table1 
Set col1 = convert(binary convert(col1 using latin1) using utf8)

【讨论】:

  • 这对我来说也适用于嵌套在 orm 深处(propel 2)。
猜你喜欢
  • 1970-01-01
  • 2011-12-04
  • 2011-04-04
  • 2018-01-23
  • 2020-06-01
  • 2011-02-21
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
相关资源
最近更新 更多