Does PostgreSQL handle case-insensitive database as good as others?
When I have a, A, b and the non-English char, the result is a, A, b. And when I have a, A, B and the non-English char, the result is A, a,
B.

It's an effect of the deterministic collation property being false. There is no tie-breaker between equivalent strings, so a may come out before A or the opposite. Also sorts in database are generally not stable, because in relational theory, rows have no inherent order so sticking to the &quot;original order&quot; makes no sense.
If you don't like that, you may add a second order with a deterministic collation, for instance
ORDER BY field COLLATE &quot;non-deterministic-collation&quot;, field COLLATE &quot;C&quot;


I use Full-Text indices for the search in the parts that users can input English words. I don't know how my collation will affect
Full-Text.

It doesn't. The full text search parser is mostly influenced by the lc_ctype property of the database. There is even a specific error associated to forcing a collation when extracting a tsvector from a string:
=&gt; select to_tsvector('abc') collate &quot;C&quot;;
ERROR:  collations are not supported by type tsvector


I need Persian collation (Not sure if I do, the collation in the docs handles the sorting fine but I did not test storing it - in CentOs).

When a database is created, it does inherit a collation from the template database, or get it from the lc_collate or locale clause if specified explicitly. That's the default collation for all sorts and string comparisons in this database.
If you use Linux in an UTF-8 encoding with fa_IR locale, the lc_collate of your database is probably fa_IR.UTF-8, so it does use a Persian collation implicitly. There is no clear indication in your question that your application really needs to create custom collations beyond that.
The details for creating collation can be fine here and here and to create Persian collation the following can be used.
CREATE COLLATION the_name (provider = icu, locale = 'fa-IR@colStrength=secondary', deterministic = false);