Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

4.0.0 Fehlerhafte defaults-Werte in Table-Manager-Tabelle bei Textfeldern (führen zu Problemen) #1215

Open
alxndr-w opened this issue Jan 2, 2022 · 10 comments
Milestone

Comments

@alxndr-w
Copy link
Contributor

alxndr-w commented Jan 2, 2022

Erläuterung: MariaDB ist in der Lage, defaults-Werte zu speichern für Felder. Diese werden über den Table Manager in rex_yform_field definiert, hier am Beispiel der Tabelle rex_ycom_user.

Standardmäßig ist der default-Wert für Textfelder leer und nicht nullable.

Beim Update der Felder werden vom Table Manager dann fälschlicherweise statt einem leeren String Anführungszeichen '' eingetragen.

gelb: So, wie YForm standardmäßig Felder einträgt.
rote Häkchen: So, wie ich das Problem aktuell umgehe mit NULL

image

gelb: Das, was YForm als default-Wert einträgt und zu Problemen führt.

image

Das führt aktuell bei einem Projekt mit @tyrant88 am Ende zu Problemen bei YDeploy, wenn lokal mit MariaDB und live mit MySQL gearbeitet wird, das scheinbar nicht in der Lage ist, die default-Werte zu verwenden.


    rex_sql_table::get('rex_ycom_user')
        ->ensureColumn(new rex_sql_column('salutation', 'text', false, null, null), 'ycom_groups')
        ->ensureColumn(new rex_sql_column('firstname', 'varchar(191)', false, '', null))
        ->ensureColumn(new rex_sql_column('lastname', 'varchar(191)', false, '', null), 'firstname')
        ->ensureColumn(new rex_sql_column('contact_name_show', 'text', false, '\'\'', null), 'lastname') // <---- hier problematische default-Werte 
        ->ensureColumn(new rex_sql_column('email', 'varchar(191)', false, '', null), 'contact_name_show')
        ->ensureColumn(new rex_sql_column('contact_mail_show', 'text', false, '\'\'', null), 'email') // <---- hier problematische default-Werte 
        ->ensureColumn(new rex_sql_column('address', 'text', false, '\'\'', null), 'contact_mail_show') // <---- hier problematische default-Werte 
        ->ensureColumn(new rex_sql_column('address_show', 'tinyint(1)', false, '0', null), 'address')
        ->ensureColumn(new rex_sql_column('contact_show', 'text', false, '\'\'', null), 'address_show') // <---- hier problematische default-Werte 
        ->ensureColumn(new rex_sql_column('login', 'varchar(191)', false, '', null), 'contact_show')
        ->ensureColumn(new rex_sql_column('password', 'varchar(255)', false, null, null), 'login')
        ->ensureColumn(new rex_sql_column('status', 'text', false, null, null), 'password')
        ->ensureColumn(new rex_sql_column('activation_key', 'varchar(191)', false, null, null), 'status')
        ->ensureColumn(new rex_sql_column('session_key', 'varchar(191)', false, null, null), 'activation_key')
        ->ensureColumn(new rex_sql_column('termsofuse_accepted', 'tinyint(1)', false, '0', null), 'session_key')
        ->ensureColumn(new rex_sql_column('new_password_required', 'tinyint(1)', false, '0', null), 'termsofuse_accepted')
        ->ensureColumn(new rex_sql_column('last_action_time', 'datetime', false, null, null), 'new_password_required')
        ->ensureColumn(new rex_sql_column('last_login_time', 'datetime', false, null, null), 'last_action_time')
        ->ensureColumn(new rex_sql_column('termination_time', 'datetime', false, null, null), 'last_login_time')
        ->ensureColumn(new rex_sql_column('login_tries', 'int(11)', true, null, null), 'termination_time')
        ->ensureColumn(new rex_sql_column('name', 'varchar(191)', false, '', null))
        ->alter();

Standard-Wert sollte NULL sein oder gar nicht gesetzt werden (kein(e)) damit 1. der default überhaupt Wert korrekt ist (leer, nicht die Zeichen ''), 2. das einem nicht um die Ohren fliegt, wenn man einen DBMS-Wechsel hat.

@dergel dergel added this to the 4.0 milestone Jan 5, 2022
@gharlan
Copy link
Member

gharlan commented Jan 5, 2022

Verwandtes Issue: yakamara/ydeploy#39
Und: redaxo/redaxo#3270

@tyrant88
Copy link
Contributor

tyrant88 commented Jan 5, 2022

Okay, danke für die ganzen Infos!
Also muss der, der Maria-Db nutzt aufpassen, wenn er neue Felder anlegt... :-)

@gharlan
Copy link
Member

gharlan commented Jan 5, 2022

Ja, wobei somit yform am besten auch gar nicht erst versuchen sollte, für TEXT-Spalten Default-Werte zu setzen.

@tyrant88
Copy link
Contributor

tyrant88 commented Jan 5, 2022

Ja, klar, ich gehe davon aus, dass yform entsprechend gefixt wird.
Jan hat es ja schon dem 4.0 Milestone zugeordnet ;-)
Und das müsste jedes AddOn machen, das TEXT-Felder in der Datenbank anlegt, richtig?

@gharlan
Copy link
Member

gharlan commented Jan 5, 2022

Ja. Wobei mir aktuell keine weiteren problematischen Fälle bekannt sind.
Ist das Problem in yform eigentlich neu in 4.0? Wisst ihr das?
Denn wundere mich, dass es bei uns noch nicht aufgetreten ist. Wir arbeiten lokal mit mariadb, produktiv haben wir aber öfters mysql. So war ja auch der metainfo-Fall bei uns aufgefallen.

@tyrant88
Copy link
Contributor

tyrant88 commented Jan 5, 2022

Bei uns traten die Probleme erst mit dem Update auf 4.0.0 auf.

@alxndr-w
Copy link
Contributor Author

alxndr-w commented Jan 6, 2022

Was mir eben sofort ins Auge gesprungen ist, ist, dass escapte Anführungszeichen als Wert verwendet werden. Also als ob irgendwo in einer Methode statt ein '' übergeben wird (leerer escapter String?) und daraus dann nochmals escaped \'\' wird.

Ein leerer String wäre ja auch ebenfalls korrekt. Nur eben nicht '' als Default-Wert.

@gharlan
Copy link
Member

gharlan commented Jan 6, 2022

MariaDB liefert bei TEXT-Columns so die Default-Values. Also mit zusätzlichen Anführungszeichen. Warum das so ist, weiß ich gerade nicht (mehr).
Und die Backslashes kommen halt hinzu, weil der String als PHP-String mit einfachen Anführungszeichen in der Datei steht. Letztlich ist es ein String mit zwei Anführungszeichen drin, ohne Backslashes.

Ich bin mir gerade nicht ganz sicher, meine aber, dass innerhalb von MariaDB das so auch dann wieder funktioniert, wenn der Default-Wert so gesetzt wird. Bloß in Kombination mit MySQL funktioniert es so nicht. MySQL unterstützt allgemein keine Default-Values für TEXT-Columns, wirft aber anscheinend nur Fehler bei diesen komischen Values aus MariaDB mit zusätzlichen Anführungszeichen.

So ganz genau weiß ich es nicht mehr alles. Aber im Metainfo-Fall konnten wir es halt lösen, indem wir gar nicht mehr versuchen, Default-Values für TEXT-Columns zu setzen, da MySQL sie halt sowieso nicht unterstützt.

@alxndr-w
Copy link
Contributor Author

alxndr-w commented Jan 6, 2022

Das kommt mir spanisch vor. Dann müsste man das ja schon bei dem Abfrage-Ergebnis an MariaDB für sich zu einem leeren String oder null abwandeln und schon wäre das Problem gelöst, oder?

@gharlan
Copy link
Member

gharlan commented Jan 6, 2022

MariaDB liefert die Anführungszeichen, weil auch andere Expressions möglich sind als Default-Value, wie CONCAT(...).
Deswegen kann es problematisch sein, die Anführungszeichen zu entfernen. Speziell für den leeren String könnte man es vermulich aber machen.

@dergel dergel modified the milestones: 4.0, 4.1 Mar 9, 2022
@dergel dergel modified the milestones: 4.1, 4.x Feb 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants