ormlite 用问号改变字符

ormlite change characters with question marks

我在 ormlite 中使用以下查询 Mysql:

String _textSearch="%اعصاب%";
Where<QuestionEntity, Long> _where= getDao().queryBuilder()).where();

List<QuestionEntity> _lst= _where.or(_where.like("title",_textSearch ),
    _where.like("questiontext", _textSearch)).query();

但生成以下查询:

SELECT * FROM `question`
    WHERE (`title` LIKE '%?????%' OR `questiontext` LIKE '%?????%' )

为什么?

SELECT * FROM `question`
    WHERE (`title` LIKE '%?????%' OR `questiontext` LIKE '%?????%' )

Hrm,我不确定这里有什么问题。我已经将 this UTF8 query-build test 添加到 ormlite-core 项目并且它通过了。

Foo foo = new Foo();
foo.stringField = "اعصاب";
dao.create(foo);
List<Foo> results = dao.queryBuilder().where()
   .like(Foo.STRING_COLUMN_NAME, foo.stringField).query();
assertEquals(foo.stringField, results.get(0).stringField);

这会生成以下日志输出:

SELECT * FROM `foo` WHERE `string` LIKE 'اعصاب' 

这也适用于 SelectArg,这就是 ORMLite 执行 ? 参数的方式。

statement arguments: [اعصاب]
SELECT * FROM `foo` WHERE `string` LIKE ?

我最初认为这是 MySQL 的问题。也许您从服务器日志中获取了查询?如果你得到'??????'从本地日志然后我不确定问题是什么。也许是您应用程序的默认字符编码?

测试使用的是 H2,它是原生 Java 数据库,因此可以轻松处理 Java 的字符串。也许看看这些 MySQL questions/answers 寻求帮助:

  • How to make MySQL handle UTF-8 properly
  • JDBC url for MySQL configuration to use utf8 character encoding

有人谈论 MySQL 连接器的更高版本修复了检测数据库字符类型的问题。