Textfeld / nachträgliche Längenbegrenzung

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
Paolo Theiss [ Di, 27 März 2007 18:37 ] [ ID #1669862 ]

Re: Textfeld / nachträgliche Längenbegrenzung

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)
Andreas Kretschmer [ Di, 27 März 2007 19:04 ] [ ID #1669864 ]

Re: Textfeld / nachträgliche Längenbegrenzung

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
Paolo Theiss [ Di, 27 März 2007 19:27 ] [ ID #1669865 ]

Re: Textfeld / nachträgliche Längenbegrenzung

Paolo Theiss <pt [at] redseven.de> 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
Axel Schwenke [ Di, 27 März 2007 19:44 ] [ ID #1669868 ]

Re: Textfeld / nachträgliche Längenbegrenzung

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)
Andreas Kretschmer [ Di, 27 März 2007 20:05 ] [ ID #1669869 ]

Re: Textfeld / nachträgliche Längenbegrenzung

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)
Andreas Kretschmer [ Di, 27 März 2007 20:07 ] [ ID #1669870 ]

Re: Textfeld / nachträgliche Längenbegrenzung

Andreas Kretschmer <akretschmer [at] spamfence.net> wrote:
> begin Axel Schwenke <axel.schwenke [at] gmx.de> 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
Axel Schwenke [ Di, 27 März 2007 21:19 ] [ ID #1669877 ]

Re: Textfeld/ nachträgliche Längenbegrenzung

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

> begin Axel Schwenke <axel.schwenke [at] gmx.de> 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
B.Steinbrink [ Di, 27 März 2007 21:34 ] [ ID #1669878 ]

Re: Textfeld / nachträgliche Längenbegrenzung

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)
Andreas Kretschmer [ Di, 27 März 2007 22:20 ] [ ID #1669880 ]

Re: Textfeld / nachträgliche Längenbegrenzung

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
Siegfried Schmidt [ Do, 29 März 2007 12:01 ] [ ID #1672305 ]

Re: Textfeld / nachträgliche Längenbegrenzung

Siegfried Schmidt <usenet-57 [at] schmidt.ath.cx> 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)
Andreas Scherbaum [ Do, 29 März 2007 18:03 ] [ ID #1672307 ]

Re: Textfeld / nachträgliche Längenbegrenzung

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)
Andreas Kretschmer [ Do, 29 März 2007 18:45 ] [ ID #1672308 ]
Datenbanken » de.comp.datenbanken.mysql » Textfeld / nachträgliche Längenbegrenzung

Vorheriges Thema: Spaltenwerte zu Spaltenüberschriften
Nächstes Thema: Abfrageprobem über mehrere Tabellen