为 postgresql 数据库设置默认排序规则

Oğu*_*pçu 2 postgresql collation

我创建了一个带有土耳其语排序规则的数据库。

\n\n
createdb -l tr_TR test_tr -E LATIN5 -T template0\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后是一张有一行的桌子。

\n\n
\\c test_tr    \ncreate table turkish(one text);\ninsert into turkish values(\'inci\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

一切都在预料之中。

\n\n
test_tr=# \\l\n                                  List of databases\n    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   \n------------+----------+----------+-------------+-------------+-----------------------\n test_tr    | postgres | LATIN5   | tr_TR       | tr_TR       | \n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是,我期望 \xc4\xb0NC\xc4\xb0 但它给了我 INCI。这对于土耳其语来说是错误的。

\n\n
test_tr=# select upper("one") from turkish ;\n upper \n-------\n INCI\n(1 row)\n
Run Code Online (Sandbox Code Playgroud)\n\n

事实证明,默认排序规则仍然是英语。

\n\n
test_tr=# select upper("one" collate "tr_TR"),upper("one"), "one" from turkish ;\n upper | upper | one  \n-------+-------+------\n \xc4\xb0NC\xc4\xb0  | INCI  | inci\n
Run Code Online (Sandbox Code Playgroud)\n\n

我知道这可以通过在创建表时提供​​ tr_TR 排序规则来解决,如下所示:

\n\n
create table turkish (one text collate "tr_TR"); \n
Run Code Online (Sandbox Code Playgroud)\n\n

所以问题是:

\n\n

有什么方法可以设置 Postgresql 用于表创建的默认排序规则吗?这样,我可以在每个表创建脚本上省略不必要的排序规则规范。

\n

小智 5

你必须在数据库创建时定义它,尝试这样:

\n\n
postgres=# create database lctest encoding UTF8 LC_COLLATE \'tr_TR.utf8\' LC_CTYPE \'tr_TR.utf8\' template template0;\nCREATE DATABASE\npostgres=# \\l\n                                                  List of databases\n                Name                 |     Owner      | Encoding |   Collate   |      Ctype    |   Access privileges  \n -----------------------------------+----------------+----------+-------------+-------------+-----------------------\n en_US.UTF-8 | lctest                | postgres       | UTF8     | tr_TR.utf8  | tr_TR.utf8  |  \n\npostgres=# \\c lctest\nYou are now connected to database "lctest" as user "postgres".\nlctest=# create table lc_test (one varchar(10));\nCREATE TABLE  \nlctest=# insert into lc_test values (\'inci\');\nINSERT 0 1\nlctest=# select upper(one)  from lc_test ;\n upper\n-------\n \xc4\xb0NC\xc4\xb0\n(1 row)  \n
Run Code Online (Sandbox Code Playgroud)\n\n

希望这会有所帮助\nMarcoP。

\n