使用Solr索引包含utf8数据的latin1列

时间:2011-10-21 16:20:56

标签: mysql character-encoding solr

我正在开发一个基于PHP的webapp,它有一个现有的MySQL数据库,其中所有文本列都使用latin1编码,但它们中包含utf8数据。

这适用于PHP应用程序,它使用latin1编码进行数据库连接以检索数据,然后直接输出到浏览器,告诉浏览器页面是utf8。

但是,我们现在正在尝试使用Solr来使用MySQL JDBC连接器索引数据库,并且我们在索引中得到了一些乱语。

这是连接字符串:

<dataSource
    url="jdbc:mysql://localhost/db_name?characterEncoding=latin1&amp;characterSetResults=utf8"
    user="user" password="password" />

有没有办法让Solr将数据检索为latin1,然后将其视为utf8而不进行转换?我试过更改JDBC连接字符串中的characterEncoding和characterSetResults参数,但没有用。

我确定解决这个问题的正确方法是将所有文本列转换为utf8,但我宁愿不去那条路线(因为它会破坏webapp。)

1 个答案:

答案 0 :(得分:2)

你是对的,正确的方法是修复你的数据库。相信我,我刚刚完成了这个(修复一个solr安装,奇怪的是)并且越早修复它就会减少它会给你带来的痛苦。

有两种方法可以修复以错误编码存储的数据:

  1. mysqldump所有数据为latin1(--default-character-set=latin1),将表定义编辑为CHARACTER SET=utf8而不是latin,然后重新导入转储。

  2. 为每个错误编码的列运行两个alter语句

    ALTER table MODIFY columns BINARY

    ALTER TABLE MODIFY column VARCHAR(255) CHARSET utf8

    首先修改为BINARY,你可以欺骗MySQL,不运行latin1 =&gt; utf8转换,在你的情况下,转换会对你的数据进行双重编码和破坏。

  3. 如果您的数据库很大,1将比2快。

    之后,立即配置您的PHP应用程序以使用utf8与MySQL通信。这可以通过发送SET NAMES utf8作为每个连接的第一个查询来完成。如果PHP已经向MySQL发送utf8数据,那么您应该只需要这样做。

    如果在经过这个措辞奇妙且详细的回答之后你还在寻找一个黑客...尝试并配置JDBC以UTF8连接,但看看是否有办法让它在发出任何前命令之前发送命令工作

    如果你发出那个命令:SET NAMES latin1那么理论上,Solr应该作为UTF8连接并将来自连接的数据作为UTF8连接,但是MySQL会认为连接是latin1连接而不是转换来自你的任何数据latin1 columns。