On Mon, 05 Feb 2007 11:51:38 +0100, Martin <maaNO@SPAMscandesigns.dk>
wrote:
>> ENUM er lidt upassende her:
>>
>> For det første tillader den også tomme værdier(ikke at forveksle med
>> null). Så et felt af typen ENUM('0','1') har fire mulige værdier:
>> '0', '1', '' og NULL
>
>`test` ENUM( '0', '1' ) NOT NULL
>Nu kan man ikke bruge NULL værdi
Yep, men man kan stadigvæk indsætte værdien ''. Det er i mine øjne en
uhensigtsmæssighed ved ENUM-felter, at man ikke kan undgå '' som en
mulighed.
>> Indsætter man 0 (og ikke '0'), bliver der indsat ''
>Det går an på hvad man har sat default værdien til.
Nej - det er stadigvæk '', som bliver indsat:
mysql> CREATE TABLE enumtest (foo ENUM('0','1') DEFAULT '0' );
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO enumtest (foo) VALUES (0);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'foo' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM enumtest;
+------+
| foo |
+------+
| |
+------+
1 row in set (0.00 sec)
... og for at bevise at vores default-værdi virker:
mysql> TRUNCATE TABLE enumtest;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO enumtest () VALUES ();
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM enumtest;
+------+
| foo |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
>Korrekt - men nok det tætteste man kommer et true/false felt.
I forhold til dataintegritet, så vil jeg stadigvæk mene at BIT (NOT
NULL) er mere passende. Her vil data aldrig kunne være andet end 0
eller 1.
>Indsætter man et felt med typen BOOL så bliver det en tinyint(1)
>med NOT NULL.
NOT NULL er dog ikke implicit i BOOL; man skal selv angive det.
mysql> CREATE TABLE booltest (foo BOOL);
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO booltest (foo) VALUES (NULL);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM booltest;
+------+
| foo |
+------+
| NULL |
+------+
1 row in set (0.03 sec)
>Men så er der hele 10 muligheder (1,2,3,4,5,6,7,8,9,0)
Nej, der er alle muligheder i TINYINT. 1-tallet i TINYINT(1) er ikke
en begrænsning i feltets mulige værdi, men omhandler blot padding (fx
foranstillede nuller). Fra manualen:
http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html
==
Another extension is supported by MySQL for optionally specifying the
display width of integer data types in parentheses following the base
keyword for the type (for example, INT(4)). This optional display
width is used to display integer values having a width less than the
width specified for the column by left-padding them with spaces.
The display width does not constrain the range of values that can be
stored in the column, nor the number of digits that are displayed for
values having a width exceeding that specified for the column. For
example, a column specified as SMALLINT(3) has the usual SMALLINT
range of -32768 to 32767, and values outside the range allowed by
three characters are displayed using more than three characters.
==
Og for at bevise det:
mysql> TRUNCATE TABLE booltest;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO booltest (foo) VALUES
(0),(10),(50),(200),(500),(-10),(-100),(-1000);
Query OK, 8 rows affected, 3 warnings (0.00 sec)
Records: 8 Duplicates: 0 Warnings: 3
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------+
| Warning | 1264 | Out of range value adjusted for column 'foo' at row 4 |
| Warning | 1264 | Out of range value adjusted for column 'foo' at row 5 |
| Warning | 1264 | Out of range value adjusted for column 'foo' at row 8 |
+---------+------+-------------------------------------------------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM booltest;
+------+
| foo |
+------+
| 0 |
| 10 |
| 50 |
| 127 |
| 127 |
| -10 |
| -100 |
| -128 |
+------+
8 rows in set (0.02 sec)
>Så der findes nok ikke en "korrekt" metode at lave et true/false felt i
>MySQL 5
Dataintegritetsmæssigt må BIT være det nærmeste.
MySQL-folkene varsler dog at BOOL senere kommer til at blive
implementeret korrekt som sin egen type i overensstemmelse med
SQL-standarden.
--
- Peter Brodersen
Kendt fra Internet