如何更改方解石的默认编码字符集?

How can I change calcite's default encode character set?

我使用驱动程序管理器(例如jdbc:calcite:inline)获取方解石连接并运行 sql,但方解石的默认编码字符集(ISO)不支持汉字,想找个方法改encode字符集

我试了下面两个sql:

  1. select * 来自tb where id='啊'
  2. select * 来自tb where id= _UTF16'啊'

首先,我运行 a sql(select * from tb where id= '啊') 收到一个错误 即 "org.apache.calcite.runtime.CalciteException: Failed to encode '啊' in character set 'ISO-8859-1'".

其次,我在 sql(select * from tb where id= _UTF16'啊') 中添加了一个字符集,但我收到另一个错误 "SqlValidatorException: Cannot apply = to the two different charsets ISO-8859-1 and UTF-16LE".

您应该将 属性 calcite.default.charset 设置为您想使用的任何字符集。也就是说,我不确定这会解决您所有的问题。对其他字符集的支持确实是一项正在进行的工作。请参阅项目邮件列表中的 this discussion

背景:

  • calcite 版本为 1.27.0
  • SELECT * FROM t WHERE title IN ('中文', '简体')
  • 一样对 JdbcSchema 执行查询

解决方案:

第 1 步:通过将 source 复制到您的项目来覆盖 org.apache.calcite.sql.SqlDialect。然后修改quoteStringLiteral方法(大约420行):

public void quoteStringLiteral(StringBuilder buf, @Nullable String charsetName, String val) {
    
    // remove `if (...) quoteStringLiteralUnicode(...)`

    if (charsetName != null) {
        buf.append("_");
        buf.append(charsetName);
    }
    buf.append(literalQuoteString);
    buf.append(val.replace(literalEndQuoteString, literalEscapedQuote));
    buf.append(literalEndQuoteString);
}

第二步:在项目资源目录下创建一个名为saffron.properties的属性文件,内容如下:

calcite.default.charset = utf8