Sven Rautenberg: MySQL: varchar vs. tinytext-felder: wozu gibt's noch varchar?

Beitrag lesen

Moin!

Falsch. MySQL macht aus varchar-Feldern char-Felder. Es wird immer
die maximale Laenge gespeichert. Das hat uebrigens auch ganz konkrete
Gruende und wird auch in anderen RDBMS (z. B. PostGreSQL) getan:
nimmt man fuer ein Feld eine variable und nicht feste Laenge, kann
die Position eines Datensatzes nicht mehr in einem Zug berechnet
werden, sondern braucht linear viele Zuege.  Bitte lies es im
Sourcecode nach, wenn du mir das nicht glauben solltest. Ich habe
das bereits getan.

Dann ist die Doku unter http://dev.mysql.com/doc/mysql/en/CHAR.html also falsch?

"The length of a CHAR column is fixed to the length that you declare when you create the table. The length can be any value from 0 to 255. (Before MySQL 3.23, the length of CHAR may be from 1 to 255.) When CHAR values are stored, they are right-padded with spaces to the specified length. When CHAR values are retrieved, trailing spaces are removed.

Values in VARCHAR columns are variable-length strings. You can declare a VARCHAR column to be any length from 0 to 255, just as for CHAR columns. (Before MySQL 4.0.2, the length of VARCHAR may be from 1 to 255.) However, in contrast to CHAR, VARCHAR values are stored using only as many characters as are needed, plus one byte to record the length. Values are not padded; instead, trailing spaces are removed when values are stored. This space removal differs from the standard SQL specification."

Dass MySQL am vorgewählten Typ Änderungen vornimmt, ist jedenfalls laut Doku bekannt: http://dev.mysql.com/doc/mysql/en/Silent_column_changes.html

"- VARCHAR columns with a length less than four are changed to CHAR."
"- If any column in a table has a variable length, the entire row becomes variable-length as a result. Therefore, if a table contains any variable-length columns (VARCHAR, TEXT, or BLOB), all CHAR columns longer than three characters are changed to VARCHAR columns."

Tatsaechlich kennt MySQL keine char-Felder und verhaelt sich auch in
diesem Fall fehlerhaft.

Moment. Oben sagst du, MySQL kenne keine VARCHAR-Felder, sondern mache daraus immer CHAR, und jetzt ist es genau umgekehrt? Irgendwie klingt das konfus.

Der Standard sagt, dass Char-Felder aufgefuellt werden muessen. MySQL tut dies nicht.

Naja, der "Standard" interessiert viele DB-Hersteller nicht so richtig. :)

- Sven Rautenberg