直到今天,我才意识到我在PHP脚本中遗漏了这一点:

mysql_set_charset('utf8');

我所有的表都是InnoDB,排序规则是"utf8_unicode_ci",我所有的VARCHAR列也是"utf8_unicode_ci".我的PHP脚本上有mb_internal_encoding('UTF-8');个,我所有的PHP文件都编码为UTF-8.

所以,直到现在,每次我"插入"带有变音符号的东西,例如:

mysql_query('INSERT INTO `table` SET `name`="Jáuò Iñe"');

在本例中,"名称"内容为:Jáuò Iñe.

由于我修复了PHP和MySQL之间的字符集,新的插入现在可以正确存储.但是,我想修复目前"混乱"的所有旧行.我已经try 了很多方法,但它总是会破坏第一个"非法"字符的字符串.以下是我目前的代码:

$m = mysql_real_escape_string('¿<?php echo "¬<b>\'PHP &aacute; (á)ţăriîş </b>"; ?> ă-ţi abcdd;//;ñç´พดแทฝใจคçăâξβψδπλξξςαยนñ ;');
mysql_set_charset('utf8');
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"');
mysql_set_charset('latin1');
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"');
mysql_set_charset('utf8');

$result = mysql_iquery('SELECT * FROM `table`');
while ($row = mysql_fetch_assoc($result)) {
    $message = $row['name'];
    $message = mb_convert_encoding($message, 'ISO-8859-15', 'UTF-8');
    //$message = iconv("UTF-8", "ISO-8859-1//IGNORE", $message);
    mysql_iquery('UPDATE `table` SET `name`="'.mysql_real_escape_string($message).'" WHERE `a1`="'.$row['a1'].'"');
}

它使用预期的字符"更新",但字符串在字符"ă"之后被截断.我的意思是,这个字符和后面的字符不包括在字符串中.

此外,使用"iconv()"(即对代码进行注释)进行测试也会进行同样的操作,即使使用//忽略和//翻译也是如此

我还测试了几个字符集,介于ISO-8859-1和ISO-8859-15之间.

推荐答案

从您描述的情况来看,似乎您有UTF-8数据,这些数据最初存储为拉丁语-1,然后没有正确转换为UTF-8.数据是可恢复的;你需要一个MySQL函数,比如

convert(cast(convert(name using  latin1) as binary) using utf8)

可能需要省略内部转换,这取决于编码转换期间数据的更改方式.

Mysql相关问答推荐

通过 Gorm 查询模型

在 MySQL 中为多列创建索引以进行查询优化

MySQL 查询组按日期(12 小时间隔)

mysql 5.5;可以从记录中排除表吗?

MySQL - 计算行重复的最大计数

此插页中的“X”是什么> X'3C2F756C3E'

使用带有 ELSEIF 和 ELSE 的 3 列更新问题

结果差异(MySQL 5.7 vs MySQL 8.0)

LEFT JOIN 仅第一行

如何使用axios发布查询参数?

SQLite 插入 - 重复键更新 (UPSERT)

Sequel Pro 和 MySQL 连接失败

Laravel mysql迁移错误

加载 MySQLdb 模块时出错“您安装了 mysqlclient 还是 MySQL-python?”

PDO::__construct():服务器向客户端发送未知字符集 (255).请向开发人员报告

Sequelize:销毁/删除表中的所有记录

docker-entrypoint-initdb 中的 MySQL 脚本未执行

UTF-8 字符有问题;我看到的不是我存储的

Laravel 数据库模式,可以为空的外部

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合