
[英]performance type varchar(1) or smallint to store status 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.