php – 比较存储在不同编码中的相同值

前端之家收集整理的这篇文章主要介绍了php – 比较存储在不同编码中的相同值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

enter image description here

这种方式已经存储了大量数据,两个系统都运行正常,因此我无法更改PHP编码或数据库.一个系统处理来自票房的销售,另一个系统处理来自网站的销售.

问题►我需要将右列(tipo_boleto_tipo)与左列(tipo)进行比较,以便在左表的另一列中获取值(在图像中看不见),但由于相同的值,我没有得到任何结果存储不同,例如,当我搜索“Niños”时,找不到它,因为它被存储为“Niños”(西班牙语中的“儿童”).我试图通过使用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”vs“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

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

原文链接:https://www.f2er.com/mysql/434148.html

猜你在找的MySQL相关文章