BUG #15637: Problem insert data 【Japanese】

Started by PG Bug reporting formabout 7 years ago3 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following bug has been logged on the website:

Bug reference: 15637
Logged by: Thanh Huynh Van
Email address: thanhhv26@gmail.com
PostgreSQL version: 11.1
Operating system: Window Server 2012 Standard
Description:

I created table has a column 【"C_VAL" character varying(10)】 after that I
insert data【'不具合管理報告書': length=24】. It was inserted successfully => this is
problem.
* Details:
-- Step 1: Create table. Data length of "C_VAL" column = 10
create table "USER02"."T_331_VARCHAR" (
"ID" numeric not null
, "C_VAL" character varying(10)
, primary key ("ID")
);
-- Step 2: Check data length. OCTET_LENGTH('不具合管理報告書') = 24
SELECT OCTET_LENGTH('不具合管理報告書');
-- Step 3: Insert data. Length '不具合管理報告書' = 24
INSERT INTO "USER02"."T_331_VARCHAR"("ID", "C_VAL")
VALUES(1,'不具合管理報告書');
-- Step 4: Check length of inserted data
SELECT OCTET_LENGTH("C_VAL"), * FROM "USER02"."T_331_VARCHAR";
=> Why 【Step 3】was successful ?. Can you help me ?
Thank you !

#2Marc Schablewski
ms@clickware.de
In reply to: PG Bug reporting form (#1)
Re: BUG #15637: Problem insert data 【Japanese】

Am 15.02.2019 um 03:43 schrieb PG Bug reporting form:

I created table has a column 【"C_VAL" character varying(10)】 after that I
insert data【'不具合管理報告書': length=24】. It was inserted successfully => this is
problem.
* Details:
-- Step 1: Create table. Data length of "C_VAL" column = 10
create table "USER02"."T_331_VARCHAR" (
"ID" numeric not null
, "C_VAL" character varying(10)
, primary key ("ID")
);
-- Step 2: Check data length. OCTET_LENGTH('不具合管理報告書') = 24
SELECT OCTET_LENGTH('不具合管理報告書');
-- Step 3: Insert data. Length '不具合管理報告書' = 24
INSERT INTO "USER02"."T_331_VARCHAR"("ID", "C_VAL")
VALUES(1,'不具合管理報告書');
-- Step 4: Check length of inserted data
SELECT OCTET_LENGTH("C_VAL"), * FROM "USER02"."T_331_VARCHAR";
=> Why 【Step 3】was successful ?. Can you help me ?
Thank you !

I think it works because a multibyte character is still considered a single character, even if it is
represented internally with more than one byte. This means your octet_length() can be bigger than
the character length of your string returned by length(). The string in your example is still only 8
characters and should fit into your colum.

Marc

#3Francisco Olarte
folarte@peoplecall.com
In reply to: PG Bug reporting form (#1)
Re: BUG #15637: Problem insert data 【Japanese】

On Fri, Feb 15, 2019 at 12:50 PM PG Bug reporting form
<noreply@postgresql.org> wrote:

It's been answered before, but..

I created table has a column 【"C_VAL" character varying(10)】

The first sentence of the first paragraph of the "8.3 character types"
of the manual reads:

"SQL defines two primary character types: character varying(n) and
character(n), where n is a positive integer. Both of these types can
store strings up to n characters (not bytes) in length. "

-- Step 2: Check data length. OCTET_LENGTH('不具合管理報告書') = 24
SELECT OCTET_LENGTH('不具合管理報告書');
-- Step 3: Insert data. Length '不具合管理報告書' = 24
INSERT INTO "USER02"."T_331_VARCHAR"("ID", "C_VAL")
VALUES(1,'不具合管理報告書');
-- Step 4: Check length of inserted data
SELECT OCTET_LENGTH("C_VAL"), * FROM "USER02"."T_331_VARCHAR";
=> Why 【Step 3】was successful ?. Can you help me ?

Try asking for the SQL standard
"char_length(string) or character_length(string) int Number of
characters in string char_length('jose')"
or the additional ( but the one which I mostly use )
"length(string) int Number of characters in string"
instead of the SQL standard
"octet_length(string) int Number of bytes in string"

( quoted from the first two tables of 9.4-String functions and operators)
( I suspect length is listed in the standard specifically to avoid
doubts about whether it returns bytes, chars or codepoints or whatever
)

Francisco Olarte.