如何更改方解石的默认编码字符集?
How can I change calcite's default encode character set?
我使用驱动程序管理器(例如jdbc:calcite:inline)获取方解石连接并运行 sql,但方解石的默认编码字符集(ISO)不支持汉字,想找个方法改encode字符集
我试了下面两个sql:
- select * 来自tb where id='啊'
- 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
我使用驱动程序管理器(例如jdbc:calcite:inline)获取方解石连接并运行 sql,但方解石的默认编码字符集(ISO)不支持汉字,想找个方法改encode字符集
我试了下面两个sql:
- select * 来自tb where id='啊'
- 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