Textfeld / nachträgliche Längenbegrenzung

Textfeld / nachträgliche Längenbegrenzung

am 27.03.2007 18:37:02 von Paolo Theiss

Hallo!

in einer bestehenden Tabelle einer DB möchte ich nachträglich eine
Längenbegrenzung für ein Textfeld vornehmen. So sieht die entsprechende
Tabelle derzeit aus, das relevante Feld heißt body:

+--------+------------------+------+-----+---------+-------- --------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+-------- --------+
| id | int(10) unsigned | | PRI | NULL | auto_increment |
| body | text | | | | |
| thread | int(10) unsigned | | MUL | 0 | |
+--------+------------------+------+-----+---------+-------- --------+

Frage 1: Ist eine Längenbegrenzung für den Feldtyp Text überhaupt möglich?
Frage 2: Wie sähe das SQL-Statement aus, um eine Längenbegrenzung
vorzunehmen?
Frage 3: Beeinträchtigt eine solche Veränderung schon vorhandene
Feldinhalte?

Vielen Dank für Eure Hilfe,
Grüße,
Paolo

Re: Textfeld / nachträgliche Längenbegrenzung

am 27.03.2007 19:04:31 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Textfeld / nachträgliche Längenbegrenzung

am 27.03.2007 19:27:29 von Paolo Theiss

Andreas Kretschmer schrieb:

>> Frage 1: Ist eine Längenbegrenzung für den Feldtyp Text überhaupt möglich?

> 1. Ja.

>> Frage 2: Wie sähe das SQL-Statement aus, um eine Längenbegrenzung
>> vorzunehmen?

> 2. guggst Du:
> test=*# alter table blubber alter column a type char(5);

Von dort aus konnte ich mir's erschließen: in mysql war ich mit
alter table blubber modify a text(1500)
erfolgreich.

>> Frage 3: Beeinträchtigt eine solche Veränderung schon vorhandene
>> Feldinhalte?

> 3. nein

vielen dank für die fixe und hilfreiche antwort!

paolo

Re: Textfeld / nachträgliche Längenbegrenzung

am 27.03.2007 19:44:52 von Axel Schwenke

Paolo Theiss wrote:
> Hallo!
>
> in einer bestehenden Tabelle einer DB möchte ich nachträglich eine
> Längenbegrenzung für ein Textfeld vornehmen. So sieht die entsprechende
> Tabelle derzeit aus, das relevante Feld heißt body:
>
> +--------+------------------+------+-----+---------+-------- --------+
> | Field | Type | Null | Key | Default | Extra |
> +--------+------------------+------+-----+---------+-------- --------+
> | id | int(10) unsigned | | PRI | NULL | auto_increment |
> | body | text | | | | |
> | thread | int(10) unsigned | | MUL | 0 | |
> +--------+------------------+------+-----+---------+-------- --------+
>
> Frage 1: Ist eine Längenbegrenzung für den Feldtyp Text überhaupt möglich?

Nein.

> Frage 2: Wie sähe das SQL-Statement aus, um eine Längenbegrenzung
> vorzunehmen?

Wenn du statt TEXT mit VARCHAR leben kannst, dann ALTER TABLE ...
(ich will dir nicht den Spaß verderben, das Handbuch selber zu lesen)

> Frage 3: Beeinträchtigt eine solche Veränderung schon vorhandene
> Feldinhalte?

Wenn die neue Länge kürzer ist, werden die Werte entsprechend
abgeschnitten und du bekommst für jede Zeile eine Warnung.


XL

Re: Textfeld / nachträgliche Längenbegrenzung

am 27.03.2007 20:05:27 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Textfeld / nachträgliche Längenbegrenzung

am 27.03.2007 20:07:56 von Andreas Kretschmer

Andreas, neugierig
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Textfeld / nachträgliche Längenbegrenzung

am 27.03.2007 21:19:39 von Axel Schwenke

Andreas Kretschmer wrote:
> begin Axel Schwenke wrote:
>> Wenn die neue Länge kürzer ist, werden die Werte entsprechend
>> abgeschnitten und du bekommst für jede Zeile eine Warnung.
>
> Kann man (strict mode oder sowas) auch erzwingen, daß er mehr als nur
> eine Warnung ausgibt, also quasi einen Fehler? Geht das (passende engine
> mal angenommen) in einer TX zu machen?

~ $mysql test
Welcome to the MySQL monitor. Commands end with ; or \g.
Server version: 5.0.38-log Source distribution

mysql> create table t1 (c1 char(11));
Query OK, 0 rows affected (0,03 sec)

mysql> insert into t1 values ('abrakadabra');
Query OK, 1 row affected (0,00 sec)

mysql> alter table t1 modify c1 char(5);
Query OK, 1 row affected, 1 warning (0,00 sec)
Records: 1 Duplicates: 0 Warnings: 1

mysql> show warnings;
+---------+------+-----------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------+
| Warning | 1265 | Data truncated for column 'c1' at row 1 |
+---------+------+-----------------------------------------+
1 row in set (0,00 sec)

mysql> set sql_mode='traditional';
Query OK, 0 rows affected (0,00 sec)

mysql> alter table t1 modify c1 char(3);
ERROR 1265 (01000): Data truncated for column 'c1' at row 1

mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c1 | char(5) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0,00 sec)


http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html


XL

Re: Textfeld/ nachträgliche Längenbegrenzung

am 27.03.2007 21:34:52 von B.Steinbrink

On Tue, 27 Mar 2007 20:07:56 +0200, Andreas Kretschmer wrote:

> begin Axel Schwenke wrote:
>> Wenn die neue Länge kürzer ist, werden die Werte entsprechend
>> abgeschnitten und du bekommst für jede Zeile eine Warnung.
>
> Kann man (strict mode oder sowas) auch erzwingen, daß er mehr als nur
> eine Warnung ausgibt, also quasi einen Fehler? Geht das (passende engine
> mal angenommen) in einer TX zu machen?

1. Ja, über die sql_mode Einstellung:

mysql> SELECT * FROM andreas;
+----------+
| bar |
+----------+
| 12345678 |
+----------+
1 row in set (0.00 sec)

mysql> ALTER TABLE andreas MODIFY bar varchar(5);
Query OK, 1 row affected, 1 warning (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 1

Warning (Code 1265): Data truncated for column 'bar' at row 1
mysql> SELECT * FROM andreas;
+-------+
| bar |
+-------+
| 12345 |
+-------+
1 row in set (0.00 sec)

mysql> SET SESSION sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE andreas MODIFY bar varchar(3);
ERROR 1265 (01000): Data truncated for column 'bar' at row 1

mysql> SELECT * FROM andreas;
+-------+
| bar |
+-------+
| 12345 |
+-------+
1 row in set (0.00 sec)


2. Nein, ALTER TABLE beinhaltet IIRC leider immer noch ein implzites
COMMIT :(

Björn

Re: Textfeld / nachträgliche Längenbegrenzung

am 27.03.2007 22:20:46 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Textfeld / nachträgliche Längenbegrenzung

am 29.03.2007 12:01:33 von Siegfried Schmidt

Hallo Andreas,

>> Frage 1: Ist eine Längenbegrenzung für den Feldtyp Text überhaupt
>> möglich?

> test=*# alter table blubber alter column a type char(5);

Eine Längenbegrenzung für ein Feldtyp Text wäre aber eher ein Constraint
wie z.B.:

alter table blubber add check (char_length(a)<=5);


Siegfried
--
http://www.schmidt.ath.cx

Re: Textfeld / nachträgliche Längenbegrenzung

am 29.03.2007 18:03:20 von Andreas Scherbaum

Siegfried Schmidt wrote:
> Hallo Andreas,
>
>>> Frage 1: Ist eine Längenbegrenzung für den Feldtyp Text überhaupt
>>> möglich?
>
>> test=*# alter table blubber alter column a type char(5);
>
> Eine Längenbegrenzung für ein Feldtyp Text wäre aber eher ein Constraint
> wie z.B.:
>
> alter table blubber add check (char_length(a)<=5);

Nur schade, das Mysql (in allen Versionen, bei allen Storage Engines)
das CHECK Constraint ignoriert.

http://dev.mysql.com/doc/refman/5.1/en/create-table.html
"The CHECK clause is parsed but ignored by all storage engines."


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: Textfeld / nachträgliche Längenbegrenzung

am 29.03.2007 18:45:27 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)