我有一个问题。我通过 Spring MVC 和 Hibernate 制作了一个 WAB 应用程序,它有一个搜索。问题是当我在 openshift 上部署 WEB 应用程序时,搜索仅适用于拉丁符号。它不适用于西里尔字母。但它在我的本地机器上运行得很好。所以我不知道它会是什么。我在 openshift 上有与本地计算机上相同的数据库,我转储了数据并将其导入到 openshift。
这是搜索的方法:
public List<News> getNewsWithSubstring(String str) {
Session session = sessionFactory.getCurrentSession();
Criteria crt = session.createCriteria(News.class);
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.like("titleUa", "%" + str + "%"));
disjunction.add(Restrictions.like("titleEn", "%" + str + "%"));
disjunction.add(Restrictions.like("titleRu", "%" + str + "%"));
disjunction.add(Restrictions.like("descriptionUa", "%" + str + "%"));
disjunction.add(Restrictions.like("descriptionEn", "%" + str + "%"));
disjunction.add(Restrictions.like("descriptionRu", "%" + str + "%"));
crt.add(disjunction);
return crt.list();
}
这是连接到数据库的设置(来自 springServlet-context.xml):
<bean name="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.goldcamtech.model"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="c3p0.idle_test_period">120</prop>
<prop key="hibernate.connection.characterEncoding">utf8</prop>
</props>
</property>
</bean>
<bean name="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.18.97.4:3306/gctech_site?autoReconnect=true&useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
也许有人有什么想法?为什么它在我的本地计算机上可以使用拉丁语和西里尔语,但在 openshift 上却不能使用西里尔语?谢谢!
最佳答案
问题很可能在于本地计算机上的 MySQL 和 OpenShift 上的 MySQL 的默认配置。我建议比较表/数据库上的字符集
。如果您在创建表/数据库时没有明确指定,MySQL 将使用 my.cnf
另请参阅:Database Character Set and Collation
附注另请注意,像这样的代码
disjunction.add(Restrictions.like("titleUa", "%" + str + "%"));
在某些情况下可能会出现错误(例如,如果用户的字符串包含%
或_
字符),甚至可能导致SQL注入(inject)。
关于java - 当我将其部署在 openshift 上时,我的 WEB 应用程序中的搜索仅适用于拉丁符号,但它在我的本地计算机上运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30863288/