js、java、pg、Doris各端中英文排序差异

设置PostgreSQL排序规则
PostgreSQL Collation Support

先说下什么是locale,可以理解为地区或语言环境,排序时指定locale,则针对语言特性进行排序,常用的有en和zh。比如设置为zh,则汉字使用拼音字母(或偏旁部首)顺序来进行排序。

默认情况下是不设置locale的,直接按字符UTF8编码顺序排序(兼容ASCII码)

pg collation查询:

select pg_encoding_to_char(collencoding) as encoding,collname,collcollate,collctype from pg_collation;

select datname,datcollate,datctype,pg_encoding_to_char(encoding) as encoding from pg_database;

pg排序:

SELECT name FROM
(
select unnest(array['a','A','b', 'B','哈哈','123','呵呵']) as name
) t 
order by name COLLATE "en-US-x-icu"
//['123', 'a', 'A', 'b', 'B', '呵呵', '哈哈']

SELECT name FROM
(
select unnest(array['a','A','b', 'B','哈哈','123','呵呵']) as name
) t 
order by name COLLATE "zh-x-icu"
// ['123', '呵呵', '哈哈','a', 'A', 'b', 'B']

SELECT name FROM
(
select unnest(array['a','A','b', 'B','哈哈','123','呵呵']) as name
) t 
order by name COLLATE "C"
//['123', 'A', 'B', 'a', 'b', '呵呵', '哈哈']

js排序:

var arr =["a", "A","b", "B","123","哈哈","呵呵"];
function sort(arr, locale) {
arr.sort(function (item1, item2) {
  return item1.localeCompare(item2, locale);
})
}

sort(arr,  'en');
console.log(arr);// ['123', 'a', 'A', 'b', 'B', '呵呵', '哈哈']

sort(arr,  'zh-CN');
console.log(arr); // ['123', '哈哈', '呵呵', 'a', 'A', 'b', 'B']

arr.sort();
console.log(arr);// ['123', 'A', 'B', 'a', 'b', '呵呵', '哈哈']

java排序:

 list = Arrays.stream(arr).sorted((a, b) -> {
            return Collator.getInstance(Locale.ENGLISH).compare(a, b);
        }).collect(Collectors.toList());
System.out.println(list); //['123', 'a', 'A', 'b', 'B', '呵呵', '哈哈']

String[] arr = {"a", "A","b", "B","123","哈哈","呵呵"};
List<String> list = Arrays.stream(arr).sorted((a, b) -> {
            return Collator.getInstance(Locale.CHINESE).compare(a, b);
        }).collect(Collectors.toList());
System.out.println(list); //['123', 'a', 'A', 'b', 'B', '哈哈', '呵呵']

Collections.sort(list);
System.out.println(list); //['123', 'A', 'B', 'a', 'b', '呵呵', '哈哈']

doris:

CREATE TABLE `test` (
  `dt` varchar(1000) NULL COMMENT "",
  `name` varchar(1000) NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`dt`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`dt`) BUCKETS 3
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"in_memory" = "false",
"storage_format" = "V2"
);

insert into test values ("1", "123"),("1", "a"),("1", "A"),("1", "b"),("1", "B"),("1", "哈哈"),("1", "呵呵");

SELECT name FROM test ORDER BY name;
//['123', 'A', 'B', 'a', 'b', '呵呵', '哈哈']

结果对比:

locale语言结果备注
enpg['123', 'a', 'A', 'b', 'B', '呵呵', '哈哈']无差异,但是Doris不支持
js['123', 'a', 'A', 'b', 'B', '呵呵', '哈哈']
java['123', 'a', 'A', 'b', 'B', '呵呵', '哈哈']
zhpg['123', '呵呵', '哈哈','a', 'A', 'b', 'B']不同语言差异较大
js['123', '哈哈', '呵呵', 'a', 'A', 'b', 'B']
java['123', 'a', 'A', 'b', 'B', '哈哈', '呵呵']
-pg['123', 'A', 'B', 'a', 'b', '呵呵', '哈哈']无差异
js['123', 'A', 'B', 'a', 'b', '呵呵', '哈哈']
java['123', 'A', 'B', 'a', 'b', '呵呵', '哈哈']
doris['123', 'A', 'B', 'a', 'b', '呵呵', '哈哈']

可以看到,针对zh的排序,不同语言都是有差异的,想要使结果一致是很难做到的
en虽然在java、js、pg中的表现一致,但是Doris不支持

为了保持各个端的排序显示一致,最好的做法是排序不指定locale,直接按字符UTF8编码排序
pg可以组装sql时order by中加入COLLATE “C”,也可以再定义表结构时定义好COLLATE ,针对已经定义好的字段,可以:ALTER TABLE ${tableName} ALTER COLUMN {columnName} type varchar(64) COLLATE “C”

### Java 连接 Doris 数据库 为了使应用程序能够通过 Java 访问 Apache Doris 数据库,可以采用 JDBC 接口完成这一操作。由于 Doris 支持 MySQL 协议,因此可以通过标准的 MySQL 驱动程序来建立连接[^1]。 #### 准备工作 确保已经下载并安装了适用于 Doris 的 MySQL Connector/J 驱动包,并将其加入项目的类路径中。此驱动允许 Java 应用程序与支持 MySQL 协议的服务进行交互,而无需额外开发特定于服务的应用层协议处理逻辑[^2]。 #### 示例代码 以下是用于创建到 Doris 数据库连接的一个简单例子: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class DorisConnectionExample { public static void main(String[] args) { String jdbcUrl = "jdbc:mysql://fe_host_ip:9030/database_name"; // 替换为实际FE IP地址和数据库名称 String username = "root"; String password = ""; try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table LIMIT 5")) { while (resultSet.next()) { System.out.println(resultSet.getString(1)); } } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码展示了如何利用 `DriverManager` 类获取一个指向指定 URL 的 `Connection` 对象,以及怎样执行 SQL 查询并将结果集打印出来。请注意替换示例中的占位符(如主机IP、数据库名等),使其匹配具体的环境设置[^4]。 #### 关键点说明 - **URL**: 使用 `"jdbc:mysql://" + host + ":" + port + "/" + dbName"` 形式的字符串作为 JDBC URL 来指明目标数据库的位置。 - **用户名/密码**: 提供具有适当权限的有效凭证以便成功认证。 - **SQL 执行**: 创建 `Statement` 或者更高级别的 PreparedStatement 实例来进行 SQL 命令的操作;这里选择了简单的 `executeQuery()` 方法来运行 SELECT 语句[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值