PostgreSQL中的collations用法详解

与Oracle相比,PostgreSQL对collation的支持依赖于操作系统。

以下是基于Centos7.5的测试结果

$ env | grep LC
$ env | grep LANG
LANG=en_US.UTF-8

使用initdb初始化集群的时候,就会使用这些操作系统的配置。

postgres=# \l
                 List of databases
  Name  | Owner  | Encoding |  Collate  |  Ctype  |  Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres | postgres | UTF8   | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8   | en_US.UTF-8 | en_US.UTF-8 | =c/postgres     +
      |     |     |       |       | postgres=CTc/postgres
 template1 | postgres | UTF8   | en_US.UTF-8 | en_US.UTF-8 | =c/postgres     +
      |     |     |       |       | postgres=CTc/postgres
(4 rows)

postgres=#

在新建数据库的时候,可以指定数据库的默认的callation:

postgres=# create database abce with LC_COLLATE = "en_US.UTF-8";
CREATE DATABASE
postgres=# create database abce2 with LC_COLLATE = "de_DE.UTF-8";
ERROR: new collation (de_DE.UTF-8) is incompatible with the collation of the template database (en_US.UTF-8)
HINT: Use the same collation as in the template database, or use template0 as template.
postgres=#

但是,指定的collation必须是与template库兼容的。或者,使用template0作为模板。

如果想看看操作系统支持哪些collations,可以执行:

$ localectl list-locales

也可以登录postgres后查看:

postgres=# select * from pg_collation ;

补充:POSTGRESQL 自定义排序规则

业务场景

平时我们会遇到某种业务,例如:超市里统计哪一种水果最好卖,并且优先按地区排序,以便下次进货可以多进些货。

这种业务就需要我们使用自定义排序规则(当然可以借助多字段多表实现类似需求,但这里将使用最简单的方法--无需多表和多字段,自定义排序规则即可实现)

创建表

id为数据唯一标识,area为区域,area_code为区域代码,code为水果代码,sale_num为销量,price价格

create table sale_fruit_count (
 id INTEGER primary key,
 name VARCHAR(50),
 code VARCHAR(10),
 area VARCHAR(50),
    area_code VARCHAR(10),
 sale_num INTEGER,
 price INTEGER
)

表中插入数据

自定义排序规则

同时依据地区、销售数量排序(地区自定义排序规则)

海南>陕西>四川>云南>新疆 (ps:距离优先原则)

按排序规则查询

如果按照以往排序直接进行area_code排会发现跟我们预期效果不一样:

select * from sale_fruit_count order by area_code, sale_num desc

我们看到地域排序是按照字母编码排序的,因此需要改造排序规则:

select *
 from sale_fruit_count
 order by case area_code
     when 'HN' then 1
     when 'SX' then 2
  when 'SC' then 3
  when 'YN' then 4
  when 'XJ' then 5
  end asc
 , sale_num desc

此时即实现了自定义排序。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 解决postgresql无法远程访问的情况

    今天刚入手这个数据库玩玩,发现无法通过IP去访问数据库,后面查询原因为,该数据库默认只能通过本地连接,也就是回环地址(127.0.0.1) 解决方案: 1.修改安装目录下的data\pg_hba.conf,在配置文件最后有IPV4和IPV6的配置,新增一行(这里我用的IPV4,开放所有IP) host all all 0.0.0.0/0 md5 说明: 该配置为允许所有IP访问,下面有对应的一些配置示例提供参考 32 -> 192.168.1.1/32 表示必须是来自这个IP地址的访问才合法:

  • PostgreSQL归档配置及自动清理归档日志的操作

    在一般的生产环境中,数据库都需要开启归档模式,那么在pg中如何开启归档模式呢? pg中的归档配置涉及几个参数如下: # - Archiving - 是否开启归档 #archive_mode = off # enables archiving; off, on, or always # (change requires restart) 归档命令,注意 %p %f %% 格式化的含义. %p 是被归档的redo文件的路径, %f 是被归档的redo文档的文件名 %% 是百分号 #archive_c

  • postgresql 实现启动、状态查看、关闭

    利用psql启动数据库 [postgres@highgo ~]$ pg_ctl start 查看系统中运行的postgres进程 #ps -ef | grep postgres 连接postgresql数据库 #psql -h 127.0.0.1 -d postgres -U postgres 停止postgresql数据库实例 #pg_ctl stop #ps -ef | grep postgres 启动服务器最简单的方法是像下面这样: $ postgres -D /usr/local/pgs

  • 浅谈Postgresql默认端口5432你所不知道的一点

    关于Postgresql端口5432的定义: 5432端口,已经在IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)注册, 并把该端口唯一分配给Postgres. 这意味着,一台安装了linux OS的服务器,哪怕没有安装过postgresql数据库,也会有这个预留端口. 查看这个预留端口的方法如下: new@newdb-> cat /etc/services |grep 5432 postgres 5432/tcp postgresq

  • Postgresql 如何清理WAL日志

    WAL是Write Ahead Log的简写,和oracle的redo日志类似,存放在$PGDATA/pg_xlog中,10版本以后在$PGDATA/pg_wal目录. 如果开启了归档,在目录archive_status下会有一些文件,以ready结尾的,表示可以归档但还没有归档,done结尾的表示已经归档. 和WAL日志数量相关的几个参数: wal_keep_segments = 300 # in logfile segments, 16MB each; 0 disables checkpoi

  • Postgresql排序与limit组合场景性能极限优化详解

    1 构造测试数据 create table tbl(id int, num int, arr int[]); create index idx_tbl_arr on tbl using gin (arr); create or replace function gen_rand_arr() returns int[] as $$ select array(select (1000*random())::int from generate_series(1,64)); $$ language sq

  • postgresql修改完端口后直接psql连接数据库报错的解决

    今天修改pg的端口号port改成5435后重启完数据库的时候直接psql进库的时候进不去 [postgres@node2 data]$ psql psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432 这时,进数据库有两种方式 1.psq

  • PostgreSQL中的collations用法详解

    与Oracle相比,PostgreSQL对collation的支持依赖于操作系统. 以下是基于Centos7.5的测试结果 $ env | grep LC $ env | grep LANG LANG=en_US.UTF-8 使用initdb初始化集群的时候,就会使用这些操作系统的配置. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------

  • 基于C++中setiosflags()的用法详解

    cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2); setiosflags 是包含在命名空间iomanip 中的C++ 操作符,该操作符的作用是执行由有参数指定区域内的动作:   iso::fixed 是操作符setiosflags 的参数之一,该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧:   iso::right 也是se

  • Angular 中 select指令用法详解

    最近在angular中使用select指令时,出现了很多问题,搞得很郁闷.查看了很多资料后,发现select指令并不简单,决定总结一下. select用法: <select ng-model="" [name=""] [required=""] [ng-required=""] [ng-options=""]> </select> 属性说明: 发现并没有ng-change属性 ng-

  • java 中 ChannelHandler的用法详解

    java 中 ChannelHandler的用法详解 前言: ChannelHandler处理一个I/O event或者拦截一个I/O操作,在它的ChannelPipeline中将其递交给相邻的下一个handler. 通过继承ChannelHandlerAdapter来代替 因为这个接口有许多的方法需要实现,你或许希望通过继承ChannelHandlerAdapter来代替. context对象 一个ChannelHandler和一个ChannelHandlerContext对象一起被提供.一个

  • Java中isAssignableFrom的用法详解

    class1.isAssignableFrom(class2) 判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口.如果是则返回 true:否则返回 false.如果该 Class 表示一个基本类型,且指定的 Class 参数正是该 Class 对象,则该方法返回 true:否则返回 false. 1. class2是不是class1的子类或者子接口 2. Object是所有类的父类 一个例子搞定: package com.auuz

  • php 中的closure用法详解

    Closure,匿名函数,是php5.3的时候引入的,又称为Anonymous functions.字面意思也就是没有定义名字的函数.比如以下代码(文件名是do.php) <?php function A() { return 100; }; function B(Closure $callback) { return $callback(); } $a = B(A()); print_r($a);//输出:Fatal error: Uncaught TypeError: Argument 1

  • JavaScript中eval()函数用法详解

    eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行. 如果参数是一个表达式,eval() 函数将执行表达式.如果参数是Javascript语句,eval()将执行 Javascript 语句. 语法 复制代码 代码如下: eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句. eval()函数用法详解: 此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eva

  • C# 中string.split用法详解

    第一种方法 string s=abcdeabcdeabcde; string[] sArray=s.Split('c') ; foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab deab deab de 第二种方法 我们看到了结果是以一个指定的字符进行的分割.使用另一种构造方法对多个字 符进行分割: string s="abcdeabcdeabcde"; string[] sArray1=s.

  • JS、jQuery中select的用法详解

    1.js var obj=document.getElementById(selectid); obj.options.length = 0; //清除所有内容 obj.options[index] = new Option("three",3); //更改对应的值 obj.options[index].selected = true; //保持选中状态 obj.add(new Option("4","4")); "文本",&

  • JS中Attr的用法详解

    具体代码如下所示: <script type="text/javascript" src="js/jquery-1.8.0.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $("#btn").click(function(){ //使用attr(name)获取属性值: alert(

随机推荐