更改 MySQL 编码(关于十六进制代码?),例如 <fc> 为 ü

Change MySQL encoding (regarding hex codes?), such as <fc> to ü

我不确定我的错误是如何命名的,但我认为我的数据显示 hex codes 而不是实际的外来字符。

更准确地说,我有一个 MySQL 数据库,其中包含如下数据:

显然我的专栏有一个 utf8_unicode_ci 编码(根据 phpMyAdmin)。

现在我想将 <e9> 之类的字符串转换为 é,或者直接在 MySQL 数据库中,或者在显示输出时在 PHP 中。

显然其他人能够使用 this response 成功转换他们的 MySQL-table;

UPDATE db_name SET 
    column1=convert(cast(convert(column1 using latin1) as binary) using utf8), 
    column2=convert(cast(convert(column2 using  latin1) as binary) using utf8)

但是,这对我来说没有任何改变。

那么如何实现转换呢?

谢谢!

如果特殊字符实际上是四个字符的序列,我将如何解决这个问题。

首先确保table全部转换为utf8mb4:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4;

使用REPLACE() function逐一修复每个字符。

UPDATE mytable SET 
  column1 = REPLACE(column1, '<e9>', 'é'),
  column2 = REPLACE(column2, '<e9>', 'é');

如果您通过复制和粘贴编辑此 SQL 查询,请小心。确保在 = 的左侧和右侧都固定 column2。否则如果忘记了,可以将column1的内容复制到column2中,而column2的旧内容就丢失了。

完成 é 后,对 ü 执行类似的语句:

UPDATE mytable SET 
  column1 = REPLACE(column1, '<fc>', 'ü'),
  column2 = REPLACE(column2, '<fc>', 'ü');

您将逐渐清理所有这些十六进制序列。你可以搜索table看看你还有没有剩余:

SELECT DISTINCT REGEXP_SUBSTR(column1, '<[[:xdigit:]]{2}>') FROM mytable 
WHERE REGEXP_LIKE(column1, '<[[:xdigit:]]{2}>');

(MySQL REGEXP_SUBSTR() 需要 8.0)