Benjamin, Philip,

> > 1. Use blob instead of varchar.
> >    Problem: blob type is slower.
>
> Is that really a problem? Did you measure it? If so, I would be
> intersted in the results.

As the manual states: "Note that each BLOB or TEXT value is represented
internally by a separately allocated object. This is in contrast to all
other column types, for which storage is allocated once per column when
the table is opened." (http://www.mysql.com/doc/en/BLOB.html) Reading
between the lines, I would assume using BLOB or TEXT will affect
performance.

To cite once more: "There is no trailing-space removal for BLOB and TEXT
columns when values are stored, as there is for VARCHAR columns." So, a
solution would be to use TINYTEXT which can take up to 255 bytes.

To not only cite :) I performed this little test with MySQL 4.0.3 on a
slow Win2K box with InnoDB tables:

mysql> DESCRIBE text_tinytext; DESCRIBE text_varchar;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| col   | tinytext | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col   | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM text_tinytext; SELECT COUNT(*) FROM
text_varchar;
+----------+
| COUNT(*) |
+----------+
|    33990 |
+----------+
1 row in set (0.16 sec)

+----------+
| COUNT(*) |
+----------+
|    33990 |
+----------+
1 row in set (0.20 sec)

Seems like TINYTEXT can be even faster than VARCHAR.

Regards,
--
  Stefan Hinz <[EMAIL PROTECTED]>
  Geschäftsführer / CEO iConnect GmbH <http://iConnect.de>
  Heesestr. 6, 12169 Berlin (Germany)
  Tel: +49 30 7970948-0  Fax: +49 30 7970948-3

----- Original Message -----
From: "Benjamin Pflugmann" <[EMAIL PROTECTED]>
To: "Philip Mak" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Sunday, December 29, 2002 12:34 PM
Subject: Re: Storing a SHA1 checksum


> On Sun 2002-12-29 at 05:28:57 -0500, [EMAIL PROTECTED] wrote:
> > sql, table
> >
> > I'm storing a SHA1 checksum as "varchar(20) binary" in my
application.
> >
> > After running a test, it seems MySQL will strip trailing spaces from
a
> > varchar column, even if it is binary!
>
> Yes, the BINARY keyword only influences how comparisons are done
> (mainly case-sensivity, but also umlauts, etc...).
>
> Stripping space from VARCHAR is a known deficiency:
>
>   http://www.mysql.com/doc/en/Bugs.html
>
> It also mentions, that the TEXT/BLOB types are save from it.
>
> > That means if the last character of my SHA1 checksum happens to be a
> > space, MySQL will corrupt it.
> >
> > What should I do? It seems I can:
> >
> > 1. Use blob instead of varchar.
> >    Problem: blob type is slower.
>
> Is that really a problem? Did you measure it? If so, I would be
> intersted in the results.
>
>      Advantage: Other application programmers do not need to be aware
>      of the hack. After MySQL is fixed, the source doesn't contain
>      redundant code.
>
> > 2. Make my application pad the checksum out to 20 spaces.
> >    Problem: Increases my code complexity a bit.
>      Advantage: Doesn't affect performance (noticeably). The DBA
>      doesn't need to be aware of the hack.
>
> > 3. Wait for MySQL to fix the strip trailing spaces bug.
> >    Problem: That doesn't provide an immediate solution.
>
> 4. Append a non-space at the end, and ignore it on retrieval
>    Problem: Same as 2.
>    Although 2. looks like the prettier solution, 4. makes easier to
>    spot the problem, if the additional handling is forgotten in new
>    code.
>
> Well, what you should do? It depends on what you need. It's a
> trade-off and no one except you can answer what your priorities are.
>
> If, for example, you have many applications / programmers who access
> this stuff, 1. is least intrusive. OTOH, if it is used only in one
> place, perhaps in a well-encapsulated object, 2. is the least
> intrusive change. And someone (that includes yourself in 1 year)
> looking at your SQL dump wouldn't know why you have chosen a BLOB,
> while you can have a neat comment in the source about it.
>
> Since any of the solutions involves only minor changes, I would not
> bother to waste time on the decision. Simply go with one and rewrite
> if it really turns out to become a problem later (which I don't
> believe).
>
> HTH,
>
> Benjamin.
>
> --
> [EMAIL PROTECTED]
>
> ---------------------------------------------------------------------
> Before posting, please check:
>    http://www.mysql.com/manual.php   (the manual)
>    http://lists.mysql.com/           (the list archive)
>
> To request this thread, e-mail <[EMAIL PROTECTED]>
> To unsubscribe, e-mail
<[EMAIL PROTECTED]>
> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php
>
>


---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to