我在try 用有限的varchar(9)保存字符串字时遇到了一些问题.

create database big_text
    LOCALE 'en_US.utf8'
    ENCODING UTF8
    
    
create table big_text(
    description VARCHAR(9) not null
)

# OK
insert into big_text (description) values ('sintético')

# I Got error here
insert into big_text (description) values ('sintético')

我已经知道问题是因为一个单词使用'é' -> Latin small letter E with Acute (this case only have 1 codepoint),另一个单词使用'é' -> Latin Small Letter E + Combining Acute Accent Modifier. (this case I have 2 codepoint).

如何在有限的varchar(9)中使用这两种表示来存储相同的单词?有没有一些配置是数据库能够双向理解的?我以为数据库是UTF8就足够了,但还不够.

我很感激任何可以帮助我理解我哪里错了的解释.谢谢!

edit:事实上,我想知道有没有办法让Postgres自动为我正常化.

推荐答案

一种可能的解决方法是使用CHECK执行字符长度约束.

show lc_ctype;

  lc_ctype   
-------------
 en_US.UTF-8

create table big_text(
    description VARCHAR not null CHECK (length(normalize(description)) <= 9) 
)

-- Note shortened string. Explanation below.
select 'sintético'::varchar(9);
 varchar  
----------
 sintétic

insert into big_text values ('sintético');
INSERT 0 1

select description, length(description) from big_text;
 description | length 
-------------+--------
 sintético   |     10

insert into big_text values ('sintético test');
ERROR:  new row for relation "big_text" violates check constraint "big_text_description_check"
DETAIL:  Failing row contains (sintético test).


下面是字符串截断与插入时出现的错误的对比说明:

try 将更长的字符串存储到这些类型的列中将导致错误,除非多余的字符都是空格,在这种情况下,字符串将被截断为最大长度(这是SQL标准所要求的有点奇怪的异常).

如果显式地将值强制转换为CHARACTER VARNING(N)或CHARACTER(N),则过长值将被截断为n个字符,而不会引发错误.(这也是SQL标准所要求的.)

Postgresql相关问答推荐

如何生成给定大小且填充一个字段的数组?

我需要一个变量来引用上周的星期五

Docker化的PostgreSQL:FATAL:用户&postgres的密码身份验证失败

为什么Postgres优化器切换到嵌套循环进行连接?

GORM 不会创建 many2many 关联

是否可以在 postgresql 中添加表元数据?

转换数组类型

Postgres中的GROUP BY - JSON数据类型不相等?

包含受先前 DELETE 影响的行数的变量?

Nodejs应用程序的node-postgres vs pg-promise

如何将 DELETE 的返回值插入到 postgresql 中的 INSERT 中?

PostgreSQL INSERT 插入一个枚举数组

Rails ActiveRecord - 如何获取两个日期之间的记录

如何启动 Postgres 服务器?

如何增加 max_locks_per_transaction

python pip install psycopg2 安装错误

错误:表tablename上的更新或删除违反外键约束

全文的 Postgresql 前缀通配符

ruby on rails jsonb 列默认值

PostgreSQL - GROUP BY 子句或用于聚合函数