繁体   English   中英

如何使用有限的varchar在postgres中存储单词“é”

[英]How to store word "é" in postgres using limited varchar

我在尝试使用有限的 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')

我已经知道问题是因为一个词使用'é' -> 带有 Acute 的拉丁小写字母 E(这种情况只有 1 个代码点) ,而另一个词使用'é' -> Latin Small Letter E + Combining Acute Accent Modifier . (这种情况下我有 2 个代码点)

如何在有限的 varchar(9) 中使用两种表示形式存储相同的单词? 有一些配置是数据库能够同时理解的吗? 我认为数据库是 UTF8 就足够了,但还不够。

我感谢任何可以帮助我理解我错在哪里的解释? 谢谢!

使用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).


从这里Character 输入字符串截断的解释与插入时遇到的错误:

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

如果将一个值显式转换为字符可变(n)或字符(n),那么超长值将被截断为 n 个字符而不会引发错误。 (这也是 SQL 标准要求的。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM