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
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)
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
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
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)
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)
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
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
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)
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
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)
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)