Thread: 7.4: CHAR padding inconsistency
Hello, I read about the padding-of-CHAR-values changes in the release notes for 7.4. Making PostgreSQL less standard compliant is sad; I also disagree with the statement that trimming of trailing white-space is what people expect. What's worse, and this may be classified as an error: create table chartest(col char(10) not null); insert into chartest values ('AAA'); select character_length(col) from chartest; character_length ------------------ 10 select character_length(col || 'hey') from chartest; character_length ------------------ 6 SELECT CHARACTER_LENGTH(col) < CHARACTER_LENGTH(col||'hey') from chartest; ?column? ---------- f The last two results are horrifying, in my opinion, especially when you consider them in concert: Concatenating a value with another value decreases its length... -- Greetings from Troels Arvin, Copenhagen, Denmark
Troels Arvin wrote: > Hello, > > I read about the padding-of-CHAR-values changes in the release notes for > 7.4. > > Making PostgreSQL less standard compliant is sad; I also disagree > with the statement that trimming of trailing white-space is what people > expect. > > What's worse, and this may be classified as an error: > > create table chartest(col char(10) not null); > insert into chartest values ('AAA'); > > select character_length(col) from chartest; > character_length > ------------------ > 10 > > select character_length(col || 'hey') from chartest; > character_length > ------------------ > 6 > > SELECT CHARACTER_LENGTH(col) < > CHARACTER_LENGTH(col||'hey') from chartest; > ?column? > ---------- > f > > The last two results are horrifying, in my opinion, especially when you > consider them in concert: Concatenating a value with another value > decreases its length... Horrifying? Anyway, what did you want it to output? "AAA hey"? We could do that, but I assume most people wouldn't expect that output? If you use literals it does work: test=> SELECT 'aaa ' || 'bb'; ?column? ---------- aaa bb (1 row) I tried this and it clipped too: test=> SELECT CAST('aa ' AS CHAR(10)) || 'b'; ?column? ---------- aab (1 row) How do other databases handle this? -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Bruce said: > How do other databases handle this? I have tried on MS SQL Server 2000 and Oracle 9i for Windows. SQL Server doesn't like character_length and || , so use len and + instead. Oracle doesn't like character_length either, use length. Hope the result may help. create table chartest(col char(10) not null); insert into chartest values ('AAA'); PostgreSQL: select character_length(col) from chartest; 10 SQL Server select len(col) from chartest; 3 Oracle select length(col) from chartest; 10 PostgreSQL: select character_length(col || 'hey') from chartest; 6 SQL Server: select len(col + 'hey') from chartest; 13 Oracle: select length(col || 'hey') from chartest; 13 PostgreSQL: select 'aaa ' || 'bb'; aaa bb SQL Server: select 'aaa ' + 'bb'; aaa bb Oracle: select 'aaa ' || 'bb' from dual; aaa bb PostgreSQL: select cast('aa ' as char(10)) || 'b'; aab SQL Server: select cast('aa ' as char(10)) + 'b'; aa b Oracle: select cast('aa ' as char(10)) || 'b' from dual; aa b
On Wed, 19 Nov 2003 14:50:24 -0500, Bruce Momjian wrote: > Anyway, what did you want it to output? "AAA hey"? We could do > that, but I assume most people wouldn't expect that output? I certainly depends on their background. Personally, the padding characteristics of the CHAR type was one of the first things about SQL that I learned (the hard way). Oracle and DB2 people should be used to PostgreSQL's old behaviour. The CHAR type may seem strange to some, but they may then just use VARCHAR. > How do other databases handle this? I've started writing about it here: http://troels.arvin.dk/db/rdbms/#data_types-char Some of my test-material is also online: http://troels.arvin.dk/db/tests/chartest-20031119a/ My summary: With regard to CHAR-handling, PostgreSQL 7.4 is now in opposition to - previous versions of PostgreSQL; bad enough on its own, because there doesn't seem to have been a good discussion about it first - I can only find a few messages about it [1] - DB2 - Oracle - MSSQL (which also behaves in a non-standard way, but different from PostgreSQL 7.4) 7.4 is close to how MySQL works, though. I'm sorry about not testing this before 7.4 went gold, but I believe that this is a bug which should be corrected before too much confusion is created. Reference 1: An interesting one is this one: http://article.gmane.org/gmane.comp.db.postgresql.devel.general/10958/match=char+padding -- Greetings from Troels Arvin, Copenhagen, Denmark