php - 比较以不同编码存储的相同值

标签 php mysql

这个问题不是 PHP string comparison between two different types of encoding 的重复问题因为我的问题需要 SQL 解决方案,而不是 PHP 解决方案。


上下文 ► 有一个博物馆有两个数据库,两个数据库使用相同的字符集和排序规则 (engine=INNODB charset=utf8 collat​​e=utf8_unicode_ci),由两个不同的 PHP 系统使用。每个 PHP 系统以不同的方式存储相同的数据,下图是一个示例:

enter image description here

已经有大量数据以这种方式存储,两个系统都运行良好,所以我无法更改 PHP 编码或数据库。一个系统处理票房销售,另一个系统处理网站销售。

问题 ► 我需要比较右列 (tipo_boleto_tipo) 和左列 (tipo) 以获得值在左表的另一列中(在图像中看不到),但我没有得到任何结果,因为相同的值存储不同,例如,当我搜索“Niños”时找不到它,因为它存储为“Niñ±” os”(西类牙语中的“ child ”)。我尝试使用 utf8_encodeutf8_decode 通过 PHP 来完成它,但速度慢得令人无法接受,所以我认为最好只使用 SQL 来完成。此数据将用于可变时间段内销售(票房和互联网)的统一报告,并且必须比较数十万行,这就是使用 PHP 如此缓慢的原因。

问题 ► MYSQL 中是否有类似utf8_encodeutf8_decode 的东西可以让我匹配等效两列的值?欢迎任何其他建议。

接下来是我当前的代码(没有结果):

            DATABASE    TABLE      COLUMN
               ▼          ▼          ▼
    SELECT boleteria.tipos_boletos.genero            ◄ DESIRED COLUMN.
      FROM boleteria.tipos_boletos                   ◄ DATABASE WITH WEIRD CHARS.
INNER JOIN venta_en_linea.ventas_detalle             ◄ DATABASE WITH PROPER CHARS.
        ON venta_en_linea.ventas_detalle.tipo_boleto_tipo = boleteria.tipos_boletos.tipo
     WHERE venta_en_linea.ventas_detalle.evento_id='1'
       AND venta_en_linea.ventas_detalle.tipo_boleto_tipo = 'Niños'

ON venta_en_linea.ventas_detalle.tipo_boleto_tipo = boleteria.tipos_boletos.tipo 永远不会起作用,因为两个值不同(“Niños”与“Niños”)。

最佳答案

写入 boleteria 数据库的应用程序似乎未存储正确的 UTF-8。数据库列字符集是指MySQL如何解释字符串,但您的应用程序仍然可以写入其他字符集。

我无法从您的示例中准确判断错误的字符集是什么,但假设它是 Latin-1,您可以将其转换为 latin1(使其“正确”),然后将其转换回“实际”utf8:

SELECT 1
FROM tipos_boletos, ventas_detalle 
WHERE CONVERT(CAST(CONVERT(tipo USING latin1) AS binary) USING utf8) 
      = tipo_boleto_tipo COLLATE utf8_unicode_ci

我在 PHP 应用程序中经常看到这种情况,这些应用程序从一开始就没有仔细编写以使用 UTF-8 字符串。如果您发现性能太慢并且需要频繁转换,并且您没有机会更新写入数据错误的应用程序,您可以向 tipos_boletos 表添加一个新列和触发器并在添加或编辑记录时即时转换。

关于php - 比较以不同编码存储的相同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46159968/

相关文章:

php - 从数据库中的表中打印数据

php - 如何通过 PHP 代码将类别添加到 Wordpress 中的帖子?

php - 如何检查MySQL中是否存在行? (即检查用户名或电子邮件是否存在于 MySQL 中)

MySQL 使用具有多个返回行的子查询更新字段值

php本地连接mysql数据库

php - 如何在MySQL插入查询中自动插入特定日期和特定时间

php - 有没有办法确定自动运行脚本所需的最低 PHP 版本?

php - CakePHP 1.3 变化?

php - 尝试将小计乘以运费百分比以获得总计

mysql - ssl连接错误: unknown error number