这个问题不是 PHP string comparison between two different types of encoding 的重复问题因为我的问题需要 SQL 解决方案,而不是 PHP 解决方案。
上下文 ► 有一个博物馆有两个数据库,两个数据库使用相同的字符集和排序规则 (engine=INNODB charset=utf8 collate=utf8_unicode_ci
),由两个不同的 PHP 系统使用。每个 PHP 系统以不同的方式存储相同的数据,下图是一个示例:
已经有大量数据以这种方式存储,两个系统都运行良好,所以我无法更改 PHP 编码或数据库。一个系统处理票房销售,另一个系统处理网站销售。
问题 ► 我需要比较右列 (tipo_boleto_tipo
) 和左列 (tipo
) 以获得值在左表的另一列中(在图像中看不到),但我没有得到任何结果,因为相同的值存储不同,例如,当我搜索“Niños”时找不到它,因为它存储为“Niñ±” os”(西类牙语中的“ child ”)。我尝试使用 utf8_encode
和 utf8_decode
通过 PHP 来完成它,但速度慢得令人无法接受,所以我认为最好只使用 SQL 来完成。此数据将用于可变时间段内销售(票房和互联网)的统一报告,并且必须比较数十万行,这就是使用 PHP 如此缓慢的原因。
问题 ► MYSQL 中是否有类似utf8_encode
或utf8_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/