On Tue, 21 Jul 2009, Graeme Geldenhuys wrote:
Michael Van Canneyt wrote:
You may never trim these fields; The database contains always the
declared number of characters: the value is trimmed with a space till
the number of declared characters is reached. TField.AsString returns
what is in the database, which seems to be 8 characters in your case.
Yes Firebird returns 8 characters for a Char(2) database field. Firebird is
very happy with inserting "en", but when read it back with FPC, it returns
"en "
If I run a select query using the FlameRobin database tool against that exact
same database and table, FlameRobin returns "en". FPC's SqlDB doesn't.
==============[ database DDL ]====================
CREATE DOMAIN D_OID AS Char(36)
COLLATE UTF8;
CREATE TABLE COUNTRY(
OID D_OID NOT NULL,
ID Char(2) NOT NULL,
NAME Varchar(50) NOT NULL,
CONSTRAINT PK_COUNTRY PRIMARY KEY (OID)
);
=================[ end ]====================
When I ask FlameRobin to export the Country table data as INSERT statements,
it does it correctly with the correct spacing as shown below.
==========================
INSERT INTO COUNTRY (OID, ID, NAME) VALUES ('ZA ', 'ZA', 'South
Africa');
==========================
36 characters for the OID field and 2 characters for the ID field. Just like
I defined it in the DDL.
So why does FlameRobin handle Char() fields as I expected, but FPC's SqlDB
does something different. So who is right and who is wrong?
No, because it is fundamentally wrong.
I did not mean with a simple Trim() function. I meant being more precise and
still return the correct amount of characters as defined in the DDL. Or maybe
do some UTF8ToString() conversion or something if field charset = UTF8.
The question should be: Why does Firebird report 8 characters to your
application ?
Only via FPC's SqlDB - not via FlameRobin. See above.
That is why I wrote 'to your application', obviously.
This will require a serious amount of investigation and debugging of TDataset
and
TSQLConnection. Because according to IBConnection.pp, the field size is
determined
solely by what firebird reports in SQLLen:
else case (SQLType and not 1) of
SQL_VARYING,SQL_TEXT :
begin
TrType := ftString;
if SQLLen > dsMaxStringSize then
TrLen := dsMaxStringSize
else
TrLen := SQLLen;
end;
Which means firebird reports 8 to your application.
Michael.
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel