我正在开发一个基于PHP的webapp,它有一个现有的MySQL数据库,其中所有文本列都使用latin1编码,但它们中包含utf8数据。
这适用于PHP应用程序,它使用latin1编码进行数据库连接以检索数据,然后直接输出到浏览器,告诉浏览器页面是utf8。
但是,我们现在正在尝试使用Solr来使用MySQL JDBC连接器索引数据库,并且我们在索引中得到了一些乱语。
这是连接字符串:
<dataSource
url="jdbc:mysql://localhost/db_name?characterEncoding=latin1&characterSetResults=utf8"
user="user" password="password" />
有没有办法让Solr将数据检索为latin1,然后将其视为utf8而不进行转换?我试过更改JDBC连接字符串中的characterEncoding和characterSetResults参数,但没有用。
我确定解决这个问题的正确方法是将所有文本列转换为utf8,但我宁愿不去那条路线(因为它会破坏webapp。)
答案 0 :(得分:2)
你是对的,正确的方法是修复你的数据库。相信我,我刚刚完成了这个(修复一个solr安装,奇怪的是)并且越早修复它就会减少它会给你带来的痛苦。
有两种方法可以修复以错误编码存储的数据:
mysqldump
所有数据为latin1(--default-character-set=latin1
),将表定义编辑为CHARACTER SET=utf8
而不是latin
,然后重新导入转储。
为每个错误编码的列运行两个alter语句
ALTER table MODIFY columns BINARY
ALTER TABLE MODIFY column VARCHAR(255) CHARSET utf8
首先修改为BINARY,你可以欺骗MySQL,不运行latin1 =&gt; utf8转换,在你的情况下,转换会对你的数据进行双重编码和破坏。
如果您的数据库很大,1将比2快。
之后,立即配置您的PHP应用程序以使用utf8与MySQL通信。这可以通过发送SET NAMES utf8
作为每个连接的第一个查询来完成。如果PHP已经向MySQL发送utf8数据,那么您应该只需要这样做。
如果在经过这个措辞奇妙且详细的回答之后你还在寻找一个黑客...尝试并配置JDBC以UTF8连接,但看看是否有办法让它在发出任何前命令之前发送命令工作
如果你发出那个命令:SET NAMES latin1
那么理论上,Solr应该作为UTF8连接并将来自连接的数据作为UTF8连接,但是MySQL会认为连接是latin1连接而不是转换来自你的任何数据latin1 columns。