tag:forum.selfhtml.org,2005:/self MYSQL: NULL != '' – SELFHTML-Forum 2019-04-27T10:07:08Z https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746697#m1746697 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2019-04-13T10:21:41Z 2019-04-13T10:21:41Z MYSQL: NULL != '' <p>Hallo alle,</p> <p>Ich lege eine Tabelle an</p> <pre><code class="block language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> Dokument <span class="token punctuation">(</span> D_Name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token comment">-- und noch weitere Spalten</span> <span class="token punctuation">)</span> </code></pre> <p>mit dem Ziel leere Namen zu vermeiden. Dennoch kann ich die leere Zeichenkette in die Spalte eintragen.</p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>Dokument<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>D_Name<span class="token punctuation">`</span></span> <span class="token operator">=</span> <span class="token string">''</span> <span class="token comment">-- liefert Ergebnisse</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>Dokument<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>D_Name<span class="token punctuation">`</span></span> <span class="token operator">IS</span> <span class="token boolean">NULL</span> <span class="token comment">-- liefert ein leeres Resultat</span> </code></pre> <p>Offensichtlich ist <code class="language-sql"><span class="token string">''</span> <span class="token operator">!=</span> <span class="token boolean">NULL</span></code>. Wie kann ich auf SQL-Ebene das Eintragen leerer Werte unterbinden?</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Pantoffeltierchen haben keine Hobbys.<br> ¯\_(ツ)_/¯ </div> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746698#m1746698 ursus contionabundo 2019-04-13T10:35:59Z 2019-04-13T10:36:53Z MYSQL: NULL != '' <p>Vielleicht so:</p> <p><a href="http://www.mysqltutorial.org/mysql-check-constraint/" rel="nofollow noopener noreferrer">http://www.mysqltutorial.org/mysql-check-constraint/</a></p> <pre><code class="block language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> Dokument <span class="token punctuation">(</span> D_Name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">CHECK</span><span class="token punctuation">(</span>D_Name <span class="token operator">></span> <span class="token string">""</span><span class="token punctuation">)</span> …<span class="token punctuation">,</span> … <span class="token punctuation">)</span> </code></pre> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746699#m1746699 pl 2019-04-13T10:50:19Z 2019-04-13T10:50:19Z MYSQL: NULL != '' <p>Leere Zeichenketten sind ja auch nicht NULL sondern klar definierte Strings. Tipp: Definiere immer einen default beim Anlegen von Tabellen. GG</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746702#m1746702 Felix Riesterer https://felix-riesterer.de 2019-04-13T11:51:48Z 2019-04-13T11:51:48Z MYSQL: NULL != '' <p>Lieber Matthias,</p> <blockquote> <p>Offensichtlich ist <code class="language-sql"><span class="token string">''</span> <span class="token operator">!=</span> <span class="token boolean">NULL</span></code>.</p> </blockquote> <p>richtig. War das noch nicht klar?</p> <blockquote> <p>Wie kann ich auf SQL-Ebene das Eintragen leerer Werte unterbinden?</p> </blockquote> <p>Mir nicht bekannt, ich löse das auf PHP-Ebene, indem ich leere Werte zu <code>null</code> konvertiere und erst dann in den PDO-Aufrufen zu SQL umwandle. Deshalb verwende ich lieber kein <code>NOT NULL</code> in solchen Fällen.</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746754#m1746754 Tabellenkalk 2019-04-14T10:42:24Z 2019-04-14T10:42:24Z MYSQL: NULL != '' <p>Hallo,</p> <blockquote> <p>Wie kann ich auf SQL-Ebene das Eintragen leerer Werte unterbinden?</p> </blockquote> <p>Darf es denn in dem Feld doppelte Einträge geben? Wenn nicht, könnte 'default' plus 'unique' zielführend sein.</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746700#m1746700 ursus contionabundo 2019-04-13T10:57:04Z 2019-04-13T11:16:28Z Mögliche (funktionierende!) Lösung mit View <blockquote> <p>Wie kann ich auf SQL-Ebene das Eintragen leerer Werte unterbinden?</p> </blockquote> <p>Vielleicht so:</p> <p><a href="http://www.mysqltutorial.org/mysql-check-constraint/" rel="nofollow noopener noreferrer">http://www.mysqltutorial.org/mysql-check-constraint/</a></p> <p>Mögliche Lösung mit View:</p> <pre><code class="block language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> Dokument <span class="token punctuation">(</span> D_Name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> Query OK<span class="token punctuation">,</span> <span class="token number">0</span> <span class="token keyword">rows</span> affected <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">01</span> sec<span class="token punctuation">)</span> <span class="token keyword">CREATE</span> <span class="token keyword">VIEW</span> DokInsert <span class="token keyword">AS</span> <span class="token keyword">SELECT</span> D_Name <span class="token keyword">from</span> Dokument <span class="token keyword">WHERE</span> D_NAME <span class="token operator">></span> <span class="token string">""</span> <span class="token keyword">WITH</span> <span class="token keyword">CHECK</span> <span class="token keyword">OPTION</span><span class="token punctuation">;</span> Query OK<span class="token punctuation">,</span> <span class="token number">0</span> <span class="token keyword">rows</span> affected <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">02</span> sec<span class="token punctuation">)</span> <span class="token keyword">insert</span> <span class="token keyword">into</span> Dokument <span class="token keyword">set</span> D_NAME<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">;</span> <span class="token comment">### SO NICHT: UMGEHT CHECK ###</span> Query OK<span class="token punctuation">,</span> <span class="token number">1</span> <span class="token keyword">row</span> affected <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">01</span> sec <span class="token keyword">insert</span> <span class="token keyword">into</span> DokInsert <span class="token keyword">set</span> D_NAME<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">;</span> ERROR <span class="token number">1369</span> <span class="token punctuation">(</span>HY000<span class="token punctuation">)</span>: <span class="token keyword">CHECK</span> <span class="token keyword">OPTION</span> failed <span class="token string">'test.DokInsert'</span> <span class="token keyword">insert</span> <span class="token keyword">into</span> DokInsert <span class="token punctuation">(</span>D_NAME<span class="token punctuation">)</span> <span class="token keyword">values</span> <span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ERROR <span class="token number">1369</span> <span class="token punctuation">(</span>HY000<span class="token punctuation">)</span>: <span class="token keyword">CHECK</span> <span class="token keyword">OPTION</span> failed <span class="token string">'test.DokInsert'</span> <span class="token keyword">insert</span> <span class="token keyword">into</span> DokInsert <span class="token keyword">set</span> D_NAME<span class="token operator">=</span><span class="token string">"foo"</span><span class="token punctuation">;</span> Query OK<span class="token punctuation">,</span> <span class="token number">1</span> <span class="token keyword">row</span> affected <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">01</span> sec<span class="token punctuation">)</span> <span class="token keyword">update</span> DokInsert <span class="token keyword">set</span> D_NAME<span class="token operator">=</span><span class="token string">""</span> <span class="token keyword">where</span> D_NAME<span class="token operator">=</span><span class="token string">"foo"</span><span class="token punctuation">;</span> ERROR <span class="token number">1369</span> <span class="token punctuation">(</span>HY000<span class="token punctuation">)</span>: <span class="token keyword">CHECK</span> <span class="token keyword">OPTION</span> failed <span class="token string">'test.DokInsert'</span> <span class="token keyword">select</span> version<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">+</span><span class="token comment">-----------+</span> <span class="token operator">|</span> version<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token operator">+</span><span class="token comment">-----------+</span> <span class="token operator">|</span> <span class="token number">5.7</span><span class="token number">.20</span> <span class="token operator">|</span> <span class="token operator">+</span><span class="token comment">-----------+</span> <span class="token number">1</span> <span class="token keyword">row</span> <span class="token operator">in</span> <span class="token keyword">set</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">00</span> sec<span class="token punctuation">)</span> </code></pre> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746705#m1746705 pl 2019-04-13T12:23:22Z 2019-04-13T12:23:22Z Der Trick mit dem default <p>geht so:</p> <pre><code class="block language-perl"><span class="token variable">$dbh</span><span class="token operator">-></span><span class="token keyword">do</span><span class="token punctuation">(</span><span class="token string">"drop table stings"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$dbh</span><span class="token operator">-></span><span class="token keyword">do</span><span class="token punctuation">(</span>q<span class="token punctuation">(</span> create table stings<span class="token punctuation">(</span> sting varchar<span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">)</span> <span class="token operator">not</span> null <span class="token keyword">default</span> <span class="token string">"---"</span><span class="token punctuation">,</span> name varchar<span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">)</span> <span class="token operator">not</span> null <span class="token keyword">default</span> <span class="token string">'---'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">or</span> <span class="token keyword">die</span> <span class="token variable">$@</span><span class="token punctuation">;</span> <span class="token variable">$dbh</span><span class="token operator">-></span><span class="token keyword">do</span><span class="token punctuation">(</span>q<span class="token punctuation">(</span>insert into stings <span class="token punctuation">(</span>name<span class="token punctuation">)</span> values<span class="token punctuation">(</span><span class="token operator">?</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token string">"otto"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> __END__ mysql<span class="token operator">></span> select <span class="token operator">*</span> from stings<span class="token punctuation">;</span> <span class="token operator">+</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span><span class="token operator">+</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">+</span> <span class="token operator">|</span> sting <span class="token operator">|</span> name <span class="token operator">|</span> <span class="token operator">+</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span><span class="token operator">+</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">+</span> <span class="token operator">|</span> <span class="token operator">--</span><span class="token operator">-</span> <span class="token operator">|</span> otto <span class="token operator">|</span> <span class="token operator">+</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span><span class="token operator">+</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">+</span> <span class="token number">1</span> row in set <span class="token punctuation">(</span><span class="token number">0.00</span> sec<span class="token punctuation">)</span> </code></pre> <p>GG</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746704#m1746704 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2019-04-13T12:02:07Z 2019-04-13T12:02:07Z MYSQL: NULL != '' <p>Hallo Felix Riesterer,</p> <blockquote> <blockquote> <p>Offensichtlich ist <code class="language-sql"><span class="token string">''</span> <span class="token operator">!=</span> <span class="token boolean">NULL</span></code>.</p> </blockquote> <p>richtig. War das noch nicht klar?</p> </blockquote> <p>bis eben noch nicht.</p> <blockquote> <blockquote> <p>Wie kann ich auf SQL-Ebene das Eintragen leerer Werte unterbinden?</p> </blockquote> <p>Mir nicht bekannt, ich löse das auf PHP-Ebene, indem ich leere Werte zu <code>null</code> konvertiere und erst dann in den PDO-Aufrufen zu SQL umwandle. Deshalb verwende ich lieber kein <code>NOT NULL</code> in solchen Fällen.</p> </blockquote> <p>Ja, das habe ich auch als Lösung im Sinn.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Pantoffeltierchen haben keine Hobbys.<br> ¯\_(ツ)_/¯ </div> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746711#m1746711 pl 2019-04-13T14:50:08Z 2019-04-13T14:50:08Z MYSQL: NULL != '' <blockquote> <p>Mir nicht bekannt, ich löse das auf PHP-Ebene, indem ich leere Werte zu <code>null</code> konvertiere und erst dann in den PDO-Aufrufen zu SQL umwandle. Deshalb verwende ich lieber kein <code>NOT NULL</code> in solchen Fällen.</p> </blockquote> <p><code>Not null</code> kannst da aber auch und gerade in diesem Fall setzen. Voraussetzung ist ein <a href="https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746705#m1746705" rel="noopener noreferrer">default</a></p> <p>MFG</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746706#m1746706 dedlfix 2019-04-13T12:40:04Z 2019-04-13T12:40:21Z Der Trick mit dem default klappt nicht <p>Tach!</p> <blockquote> <pre><code class="block language-sql"> <span class="token keyword">create</span> <span class="token keyword">table</span> stings<span class="token punctuation">(</span> sting <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">)</span> <span class="token operator">not</span> <span class="token boolean">null</span> <span class="token keyword">default</span> <span class="token string">"---"</span><span class="token punctuation">,</span> name <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">)</span> <span class="token operator">not</span> <span class="token boolean">null</span> <span class="token keyword">default</span> <span class="token string">'---'</span> <span class="token punctuation">)</span> </code></pre> </blockquote> <p>Es ging darum, das Eintragen von Leerstrings zu verhindern. Default-Werte ziehen aber nur, wenn man NULL übergibt oder die Spalte im INSERT nicht mit angibt. Das Eintragen-Können von Leerstrings wird so nicht verhindert.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746733#m1746733 Felix Riesterer https://felix-riesterer.de 2019-04-14T07:34:26Z 2019-04-14T07:34:26Z MYSQL: NULL != '' <p>Lieber pl,</p> <blockquote> <p><code>Not null</code> kannst da aber auch und gerade in diesem Fall setzen. Voraussetzung ist ein <a href="https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746705#m1746705" rel="noopener noreferrer">default</a></p> </blockquote> <p>Du hast in dieser Diskussion hier anscheinend weder mitgelesen noch mitgedacht, sonst hättest Du inzwischen dazugelernt, dass Dein Vorschlag inhaltlich völlig falsch ist.</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746735#m1746735 pl 2019-04-14T08:00:35Z 2019-04-14T08:04:12Z MYSQL: NULL != '' <blockquote> <blockquote> <p><code>Not null</code> kannst da aber auch und gerade in diesem Fall setzen. Voraussetzung ist ein <a href="https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746705#m1746705" rel="noopener noreferrer">default</a></p> </blockquote> <p>Du hast in dieser Diskussion hier anscheinend weder mitgelesen noch mitgedacht, sonst hättest Du inzwischen dazugelernt, dass Dein Vorschlag inhaltlich völlig falsch ist.</p> </blockquote> <p>Mein Vorschlag <strong>unterstützt und ergänzt Deinen Vorschlag</strong>! Denn Du selbst hast ja eine <a href="https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746702#m1746702" rel="noopener noreferrer">Lösung auf PHP Ebene </a>vorgeschlagen!</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746737#m1746737 Felix Riesterer https://felix-riesterer.de 2019-04-14T08:15:43Z 2019-04-14T08:15:43Z MYSQL: NULL != '' <p>Lieber pl,</p> <blockquote> <p>Mein Vorschlag <strong>unterstützt und ergänzt Deinen Vorschlag</strong>! Denn Du selbst hast ja eine <a href="https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746702#m1746702" rel="noopener noreferrer">Lösung auf PHP Ebene </a>vorgeschlagen!</p> </blockquote> <p>nein, das tut Dein Vorschlag nicht. Ein Default-Wert hat nur in ganz bestimmten Fällen seinen Sinn, nämlich dann, wenn für dieses Feld kein Wert (auch kein leerer) angegeben wurde. Das ist aber nicht das vom OP beschriebene Szenario!</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746742#m1746742 ursus contionabundo 2019-04-14T08:45:04Z 2019-04-14T08:49:48Z MYSQL: NULL != '' <p>@PL Hm. Du hast beim Scrollen die Aufgabenstellung aus den Blick verloren:</p> <blockquote> <blockquote> <blockquote> <ul> <li>Dennoch kann ich die leere Zeichenkette in die Spalte eintragen.</li> <li>Offensichtlich ist <code>'' != NULL</code>.</li> <li>Wie kann ich auf SQL-Ebene das Eintragen leerer Werte unterbinden?</li> </ul> </blockquote> </blockquote> </blockquote> <p>Bei Deinem Vorschlag (Erst einen Default in der Datenbank definieren und dann leere Strings durch NULL ersetzen) wird aber ETWAS eingetragen. <strong>Dein Vorschlag kann als Ergänzung für einen anderen Leser mit alternierendem Programmablaufplan sinnvoll sein</strong> - <a href="/users/2" class="mention registered-user" rel="noopener noreferrer">@Matthias Apsel</a> wollte das (dem Wortlaut nach) aber gerade nicht. Wobei natürlich die Frage im Raum steht, <a href="https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746700#m1746700" rel="noopener noreferrer">warum er meinen (funktionierenden und getesteten) Lösungsvorschlag nicht kommentiert hat</a>. Was ja immer den Gedanke befördert, dass er ihn ignoriert. Was dann wieder den Gedanke daran nach sich zieht, dass das auch nicht die gesuchte Lösung ist. Was dann die Idee nach sich zieht, dass er gar nicht will, was er als sein Wollen beschrieben hat.</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746741#m1746741 pl 2019-04-14T08:38:27Z 2019-04-14T08:47:22Z MYSQL: NULL != '' <p>Wissen Sie Herr Riesterer, ich mache hier nur <a href="https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746699#m1746699" rel="noopener noreferrer">Vorschläge</a> aufgrund meiner langjährigen Erfahrung mit Datenbankanwendungen. Und die ist, daß ein default in den meisten Fällen sinnvoll ist. Und in diesem Fall ist ein default ganz besonders sinnvoll. Im Übrigen unterstütze ich ja Ihren Vorschlag. GGA</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746743#m1746743 pl 2019-04-14T08:50:29Z 2019-04-14T08:50:29Z MYSQL: NULL != '' <p>Jeder Vorschlag ist sinnvoll!</p> <blockquote> <p>warum er meinen (funktionierenden und getesteten) Lösungsvorschlag nicht kommentiert hat. Was ja immer den Gedanke befördert, dass er ihn ignoriert.</p> </blockquote> <p>Kann er ja machen. Besser wärs natülich wenn er einfach mal danke sagen würde!</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746746#m1746746 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2019-04-14T09:13:20Z 2019-04-14T09:13:20Z MYSQL: NULL != '' <p>Hallo ursus contionabundo,</p> <blockquote> <p>Wobei natürlich die Frage im Raum steht, <a href="https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746700#m1746700" rel="noopener noreferrer">warum er meinen (funktionierenden und getesteten) Lösungsvorschlag nicht kommentiert hat</a>. Was ja immer den Gedanke befördert, dass er ihn ignoriert.</p> </blockquote> <p>Das tut er. Weil er dem Vorschlag von <a href="/users/243" class="mention registered-user" rel="noopener noreferrer">@Felix Riesterer</a> folgt.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Pantoffeltierchen haben keine Hobbys.<br> ¯\_(ツ)_/¯ </div> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746744#m1746744 ursus contionabundo 2019-04-14T08:57:30Z 2019-04-14T08:57:30Z MYSQL: NULL != '' <p>Abgesehenen davon, dass mir unklar ist, warum er den Test (<code>String == ""</code>) teuer mit einem Datenbankrequest machen will. Ich würde das stets in PHP machen und die Datenbank nur bemühen wenn es sein muss. Erstens wegen der Laufzeit und zweitens weil die Anwendung ohne "Spezialkram" vielleicht auch mal mit sqlite läuft.</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746750#m1746750 pl 2019-04-14T09:52:44Z 2019-04-14T09:52:44Z MYSQL: NULL != '' <blockquote> <p>Abgesehenen davon, dass mir unklar ist, warum er den Test (<code>String == ""</code>) teuer mit einem Datenbankrequest machen will. Ich würde das stets in PHP machen und die Datenbank nur bemühen wenn es sein muss. Erstens wegen der Laufzeit und zweitens weil die Anwendung ohne "Spezialkram" vielleicht auch mal mit sqlite läuft.</p> </blockquote> <p>Genau! Und: <code>.. not null default 'mydef'</code> auf diesen Fall praktisch angewandt heißt, daß man in PHP dieses Feld einfach außen vor lässt wenn der Fall Leerstring eintritt. Somit wird der default genommen, es sei denn man verzichtet komplett auf das gesamte insert Statement.</p> <p>Und genau das ist die eigentliche Frage: Was soll gemacht werden wenn bei der Datenerhebung ein Leerstring auftritt!? Wenn es darum geht ein insert nicht zu tun fällt das ohnehin nicht in den Verantwortungsbereich des RDBMS. Und wenn man andererseits bei einem insert den Leerstring nicht haben will setzt man einen davon abweichenden default. MFG</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746748#m1746748 ursus contionabundo 2019-04-14T09:45:31Z 2019-04-14T09:53:00Z MYSQL: NULL != '' <blockquote> <p>Vorschlag von <a href="/users/243" class="mention registered-user" rel="noopener noreferrer">@Felix Riesterer</a></p> </blockquote> <blockquote> <blockquote> <blockquote> <p>leere Werte zu null konvertiere und erst dann in den PDO-Aufrufen zu SQL umwandle.</p> </blockquote> </blockquote> </blockquote> <p>Hm. Der läuft also auf folgendes hinaus:</p> <p>Erst in PHP den Wert "" zu <code>NULL</code> konvertieren, dann in SQL einbauen, dann die Datenbank fragen, ob die den Eintrag akzeptiert. Falls nicht sodann mit oder wie bei einer Exception reagieren.</p> <p>Alternative:</p> <p>In PHP den Wert "" feststellen und die Datenbank gar nicht erst fragen sondern gleich darauf mit oder wie bei einer Exception zu regieren klingt irgendwie direkter und also "billiger" - oder?</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746749#m1746749 Christian Kruse https://wwwtech.de/about 2019-04-14T09:50:33Z 2019-04-14T09:50:33Z MYSQL: NULL != '' <p>Hallo Matthias,</p> <blockquote> <blockquote> <p>Wobei natürlich die Frage im Raum steht, <a href="https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746700#m1746700" rel="noopener noreferrer">warum er meinen (funktionierenden und getesteten) Lösungsvorschlag nicht kommentiert hat</a>. Was ja immer den Gedanke befördert, dass er ihn ignoriert.</p> </blockquote> <p>Das tut er. Weil er dem Vorschlag von <a href="/users/243" class="mention registered-user" rel="noopener noreferrer">@Felix Riesterer</a> folgt.</p> </blockquote> <p>Letztlich kannst nur du wissen, was deine genaue Anforderung ist, deshalb kann ich das hier nur als allgemeinen Rat formulieren: man sollte die Integrität der Daten nie auf Applikations-Ebene sicherstellen, sondern immer auf Datenbankebene. Sonst kommt man früher oder später immer auf das Problem, dass ein Zugriff an dem spezifischen Code-Pfad vorbei etwas einträgt, was nicht vorgesehen war.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746751#m1746751 ursus contionabundo 2019-04-14T09:55:32Z 2019-04-14T10:05:44Z MYSQL: NULL != '' <p>Jepp. (Auch der Vorschlag von Felix ("" → NULL in PHP) verschiebt die Integritätsprüfung in die Applikation.)</p> <blockquote> <p>Sonst kommt man früher oder später immer auf das Problem, dass ein Zugriff an dem spezifischen Code-Pfad vorbei etwas einträgt, was nicht vorgesehen war.</p> </blockquote> <p>Ich will nicht verschweigen, dass auch bei meiner Lösung ein Eintrag in die Tabelle ohne den Umweg über die View das Eintragen von "" ermöglicht.</p> <p>Ich teste gerade mal</p> <pre><code class="block">… check (spalte not like '') </code></pre> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746762#m1746762 encoder 2019-04-14T13:00:34Z 2019-04-14T13:00:34Z MYSQL: NULL != '' <blockquote> <p>man sollte die Integrität der Daten nie auf Applikations-Ebene sicherstellen, sondern immer auf Datenbankebene.</p> </blockquote> <p>Ich würde beides tun. Etwas das der Nutzer falsch machen kann und wird sollte nicht bis in die Datenbank gelangen, dort eine für den Nutzer unverständliche Fehlermeldung erzeugen und eine Transaktion zurücksetzen müssen.</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746757#m1746757 ursus contionabundo 2019-04-14T10:50:18Z 2019-04-14T10:52:02Z 2. Funktionierende Lösung: Procedur und Trigger <p>check tuts nicht. Aber die Lösung mit Procedur und Trigger tut es.</p> <ul> <li>Hat den Vorteil, dass die View nicht umgangen werden kann.</li> <li>Hat den Vorteil. dass die Prozedur leicht um weitere Fehlerprüfungen und individuelle Fehlernummern ergänzt werden kann.</li> </ul> <pre><code class="block language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> Dokument <span class="token punctuation">(</span> D_Name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># Query OK, 0 rows affected (0,02 sec)</span> <span class="token keyword">DELIMITER</span> $ <span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> <span class="token identifier"><span class="token punctuation">`</span>check_Dokument<span class="token punctuation">`</span></span><span class="token punctuation">(</span><span class="token operator">IN</span> D_Name <span class="token keyword">varchar</span><span class="token punctuation">(</span> <span class="token number">100</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">BEGIN</span> <span class="token keyword">IF</span> D_NAME <span class="token operator">LIKE</span> <span class="token string">""</span> <span class="token keyword">THEN</span> SIGNAL SQLSTATE <span class="token string">'45000'</span> <span class="token keyword">SET</span> MESSAGE_TEXT <span class="token operator">=</span> <span class="token string">'D_NAME was empty'</span><span class="token punctuation">;</span> <span class="token keyword">END</span> <span class="token keyword">IF</span><span class="token punctuation">;</span> <span class="token keyword">END</span>$ <span class="token comment"># Query OK, 0 rows affected (0,02 sec)</span> <span class="token keyword">CREATE</span> <span class="token keyword">TRIGGER</span> <span class="token identifier"><span class="token punctuation">`</span>Dokument_before_insert<span class="token punctuation">`</span></span> BEFORE <span class="token keyword">INSERT</span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>Dokument<span class="token punctuation">`</span></span> <span class="token keyword">FOR EACH ROW</span> <span class="token keyword">BEGIN</span> <span class="token keyword">CALL</span> check_Dokument<span class="token punctuation">(</span>new<span class="token punctuation">.</span>D_Name<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">END</span>$ <span class="token comment"># Query OK, 0 rows affected (0,02 sec)</span> <span class="token keyword">CREATE</span> <span class="token keyword">TRIGGER</span> <span class="token identifier"><span class="token punctuation">`</span>parts_before_update<span class="token punctuation">`</span></span> BEFORE <span class="token keyword">UPDATE</span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>Dokument<span class="token punctuation">`</span></span> <span class="token keyword">FOR EACH ROW</span> <span class="token keyword">BEGIN</span> <span class="token keyword">CALL</span> check_Dokument<span class="token punctuation">(</span>new<span class="token punctuation">.</span>D_Name<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">END</span>$ <span class="token comment"># Query OK, 0 rows affected (0,00 sec)</span> <span class="token keyword">DELIMITER</span> <span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> Dokument <span class="token punctuation">(</span>D_Name<span class="token punctuation">)</span> <span class="token keyword">values</span> <span class="token punctuation">(</span><span class="token string">"foo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># Query OK, 1 row affected (0,01 sec)</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> Dokument <span class="token punctuation">(</span>D_Name<span class="token punctuation">)</span> <span class="token keyword">values</span> <span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># ERROR 1644 (45000): D_NAME was empty</span> </code></pre> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746758#m1746758 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2019-04-14T10:52:53Z 2019-04-14T10:52:53Z 2. Funktionierende Lösung: Procedur und Trigger <p>Hallo ursus contionabundo,</p> <p>Das sieht ebenfalls sehr spannend aus und erweitert auf jeden Fall meinen Horizont.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Pantoffeltierchen haben keine Hobbys.<br> ¯\_(ツ)_/¯ </div> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746759#m1746759 1unitedpower 2019-04-14T11:09:48Z 2019-04-14T11:09:48Z 2. Funktionierende Lösung: Procedur und Trigger <blockquote> <p>check tuts nicht.</p> </blockquote> <p>Das könnte an deinem SQL-Server liegen. <a href="https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html" rel="nofollow noopener noreferrer">MySQL unterstützt check-constraints erst ab Version 8.0.16</a>, die noch nicht offiziell veröffentlicht wurde. <a href="https://mariadb.com/kb/en/library/constraint/#check-constraints" rel="nofollow noopener noreferrer">MariaDB untersützt check-constraints seit Version 10.2.1</a> (seit fast drei Jahren).</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746760#m1746760 ursus contionabundo 2019-04-14T12:03:18Z 2019-04-14T12:22:20Z 2. Funktionierende Lösung: Procedur und Trigger ( + mehrere Tests + Regex ) <blockquote> <p>Das könnte an deinem SQL-Server liegen.</p> </blockquote> <p>Ja. Mein Tisch gibt die Form meiner Stirn schon wieder ... Ich hatte tatsächlich einen alten MySql-5.7-Server (Eine virtuelle Maschine, gemacht für ein Seminar) am Start.</p> <p>Ich hab die Geschichte um einen weiteren Fehler und um einen regulären Ausdruck erweitert. Geht mit Mysql 5.7 und Mariadb 10.0:</p> <pre><code class="block language-sql"><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> <span class="token identifier"><span class="token punctuation">`</span>tabelle<span class="token punctuation">`</span></span> <span class="token punctuation">(</span> <span class="token identifier"><span class="token punctuation">`</span>spalte<span class="token punctuation">`</span></span> <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span> <span class="token number">100</span> <span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">DELIMITER</span> $ <span class="token keyword">CREATE</span> <span class="token keyword">PROCEDURE</span> <span class="token identifier"><span class="token punctuation">`</span>check_tabelle<span class="token punctuation">`</span></span><span class="token punctuation">(</span><span class="token operator">IN</span> <span class="token identifier"><span class="token punctuation">`</span>spalte<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span> <span class="token number">100</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">BEGIN</span> <span class="token keyword">IF</span> <span class="token identifier"><span class="token punctuation">`</span>spalte<span class="token punctuation">`</span></span> <span class="token operator">LIKE</span> <span class="token string">""</span> <span class="token keyword">THEN</span> SIGNAL SQLSTATE <span class="token string">'45000'</span> <span class="token keyword">SET</span> MESSAGE_TEXT <span class="token operator">=</span> <span class="token string">'spalte was empty'</span><span class="token punctuation">;</span> <span class="token keyword">END</span> <span class="token keyword">IF</span><span class="token punctuation">;</span> <span class="token keyword">SET</span> <span class="token variable">@test</span> <span class="token operator">=</span> <span class="token identifier"><span class="token punctuation">`</span>spalte<span class="token punctuation">`</span></span> <span class="token operator">REGEXP</span> <span class="token string">'[A-Za-z]{4}'</span><span class="token punctuation">;</span> <span class="token keyword">IF</span> <span class="token operator">NOT</span> <span class="token variable">@test</span> <span class="token keyword">THEN</span> SIGNAL SQLSTATE <span class="token string">'45001'</span> <span class="token keyword">SET</span> MESSAGE_TEXT <span class="token operator">=</span> <span class="token string">'Spalte was to short (Minimum: 4 chars [A-Za-z])'</span><span class="token punctuation">;</span> <span class="token keyword">END</span> <span class="token keyword">IF</span><span class="token punctuation">;</span> <span class="token keyword">END</span> $ <span class="token keyword">CREATE</span> <span class="token keyword">TRIGGER</span> <span class="token identifier"><span class="token punctuation">`</span>tabelle_before_insert<span class="token punctuation">`</span></span> BEFORE <span class="token keyword">INSERT</span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>tabelle<span class="token punctuation">`</span></span> <span class="token keyword">FOR EACH ROW</span> <span class="token keyword">BEGIN</span> <span class="token keyword">CALL</span> check_tabelle<span class="token punctuation">(</span>new<span class="token punctuation">.</span>spalte<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">END</span> $ <span class="token keyword">CREATE</span> <span class="token keyword">TRIGGER</span> <span class="token identifier"><span class="token punctuation">`</span>tabelle_before_update<span class="token punctuation">`</span></span> BEFORE <span class="token keyword">UPDATE</span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>tabelle<span class="token punctuation">`</span></span> <span class="token keyword">FOR EACH ROW</span> <span class="token keyword">BEGIN</span> <span class="token keyword">CALL</span> check_tabelle<span class="token punctuation">(</span>new<span class="token punctuation">.</span>spalte<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">END</span> $ <span class="token keyword">DELIMITER</span> <span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token identifier"><span class="token punctuation">`</span>tabelle<span class="token punctuation">`</span></span> <span class="token punctuation">(</span> spalte <span class="token punctuation">)</span> <span class="token keyword">values</span> <span class="token punctuation">(</span> <span class="token string">"foobar"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token identifier"><span class="token punctuation">`</span>tabelle<span class="token punctuation">`</span></span> <span class="token punctuation">(</span> spalte <span class="token punctuation">)</span> <span class="token keyword">values</span> <span class="token punctuation">(</span> <span class="token string">"foo"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token identifier"><span class="token punctuation">`</span>tabelle<span class="token punctuation">`</span></span> <span class="token punctuation">(</span> spalte <span class="token punctuation">)</span> <span class="token keyword">values</span> <span class="token punctuation">(</span> <span class="token string">""</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <pre><code class="block">"foobar" : Query OK, 1 row affected (0,00 sec) "foo" : ERROR 1644 (45001): Spalte was to short (Minimum: 4 chars [A-Za-z]) "" : ERROR 1644 (45000): spalte was empty </code></pre> <p>Das werde ich jetzt mal sorgfältig als Beispiel verwahren…</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746761#m1746761 MudGuard http://www.andreas-waechter.de/ 2019-04-14T12:57:35Z 2019-04-14T12:57:35Z 2. Funktionierende Lösung: Procedur und Trigger ( + mehrere Tests + Regex ) <p>Hi,</p> <blockquote> <pre><code> IF `spalte` LIKE "" THEN </code></pre> </blockquote> <p>warum LIKE für einen Vergleich mit einem konstanten Wert?</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1747527#m1747527 ursus contionabundo 2019-04-27T10:07:08Z 2019-04-27T10:07:08Z 2. Funktionierende Lösung: Procedur und Trigger ( + mehrere Tests + Regex ) <blockquote> <p>Ja. Mein Tisch gibt die Form meiner Stirn schon wieder ... Ich hatte tatsächlich einen alten MySql-5.7-Server</p> </blockquote> <p>Hab's "grad" gesehen. Der "alte MySql-5.7-Server" ist immer noch der, der auch von Ubuntu 18.04 installiert wird, wenn man das Repo nicht wechselt.</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746772#m1746772 ursus contionabundo 2019-04-14T17:26:42Z 2019-04-14T17:27:36Z 2. Funktionierende Lösung: Procedur und Trigger ( + mehrere Tests + Regex ) <blockquote> <blockquote> <pre><code> IF `spalte` LIKE "" THEN </code></pre> </blockquote> <p>warum LIKE für einen Vergleich mit einem konstanten Wert?</p> </blockquote> <p>Ich kann Dir zwei Dinge sagen:</p> <ol> <li>Du kannst das obige an Deine Bedürfnisse und Deine Fähigkeiten anpassen.</li> <li>Mit der Ansicht, dass die Meinung meiner Mutter auch nur irgendwie maßgeblich sei, war ich fertig, als diese meine Leistung in einer Mathearbeit (mit einem glatten Einser und allen Zusatzpunkten) würdigte indem sie sich über einen beschissenen Rechtschreibfehler in einem Antwortsatz aufregte.</li> </ol> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746763#m1746763 Christian Kruse https://wwwtech.de/about 2019-04-14T13:42:11Z 2019-04-14T13:42:11Z MYSQL: NULL != '' <p>Hallo encoder,</p> <blockquote> <blockquote> <p>man sollte die Integrität der Daten nie auf Applikations-Ebene sicherstellen, sondern immer auf Datenbankebene.</p> </blockquote> <p>Ich würde beides tun.</p> </blockquote> <p>Ich habe bewusst das Wort „sicherstellen“ hier gewählt, weil es mir darum ging, dass man die Integrität des Datenmodells nicht in der Anwendung erzwingen sollte.</p> <p>Dass man in der Anwendung zusätzlich (in gewissen Maßen - nicht jede Prüfung kann man auf Client-Seite erledigen) prüft, ob die Eingaben wie erwartet sind, hielt ich für selbstverständlich </p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746774#m1746774 Rolf B 2019-04-14T18:36:20Z 2019-04-14T18:36:43Z 2. Funktionierende Lösung: Procedur und Trigger ( + mehrere Tests + Regex ) <p>Hallo Jörg,</p> <p>das ist nicht mein <s>Kreuz</s> Minus.</p> <p>Wenn jemand eine clevere Lösung mit Prozeduren und Triggern präsentiert, und darin ein Test auf Gleichheit mit "LIKE" gemacht wird, dann unterstellt man doch erst einmal, dass auch dieses LIKE eine clevere Bedeutung hat und etwas tut, das vom = Operator nicht geleistet wird. Und die Rückfrage, worin diese Cleverness besteht - wenn man sie selbst nicht sofort sieht - ist schon berechtigt.</p> <p>Als Reaktion präsentierst Du eine wortreiche Version von „f*** dich“. Müssen wir daraus schließen, dass das LIKE durch ein = ersetzt werden kann und Du Dich ärgerst, dass Dir das nicht selbst aufgefallen ist?</p> <p>Vielleicht nicht. Ich habe in die Doku geschaut und kurz was ausprobiert - und ja, es kann einen Grund für LIKE geben. Der = Operator ignoriert abschließende Leerstellen, demzufolge ist <code>" " = ""</code> TRUE. Der LIKE Operator tut das nicht, <code>" " LIKE ""</code> liefert FALSE<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>.</p> <p>D.h. man muss nun entscheiden, ob man einen String mit Spaces darin als gültig akzeptieren will oder nicht, und abhängig davon den = oder LIKE Operator einsetzen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>Für einen gewissen Wert von TRUE (1) und FALSE (0). <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746783#m1746783 Self-Nachtwächter 2019-04-14T22:24:13Z 2019-04-14T22:35:24Z 2. Funktionierende Lösung: Procedur und Trigger ( + mehrere Tests + Regex ) <blockquote> <p>Als Reaktion präsentierst Du eine wortreiche Version von „f*** dich“.</p> </blockquote> <p>Ja, ich habe auf Krittelei reagiert. Das <em>"warum LIKE <strong>für einen Vergleich mit einem konstanten Wert</strong>?"</em> ist mit allem Verlaub einfach nur „gründlich missglückte Besserwisserei“. Dazu unten mehr.</p> <blockquote> <p>Müssen wir daraus schließen, dass das LIKE durch ein = ersetzt werden kann und Du Dich ärgerst, dass Dir das nicht selbst aufgefallen ist?</p> </blockquote> <p>Wieso sollte <code>LIKE</code> hier durch <code>=</code> ersetzbar sein? Aus dem besprochenen Quelltext:</p> <pre><code class="block language-sql"> <span class="token keyword">IF</span> D_NAME <span class="token operator">LIKE</span> <span class="token string">""</span> <span class="token keyword">THEN</span> SIGNAL SQLSTATE <span class="token string">'45000'</span> <span class="token keyword">SET</span> MESSAGE_TEXT <span class="token operator">=</span> <span class="token string">'D_NAME was empty'</span><span class="token punctuation">;</span> <span class="token keyword">END</span> <span class="token keyword">IF</span><span class="token punctuation">;</span> </code></pre> <p>Zitat: 'D_NAME was empty'</p> <p><code>LIKE</code> kann also NICHT durch ein <code>=</code> ersetzt werden ohne auch den <code>MESSAGE_TEXT</code> zu ersetzen. <a href="https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html" rel="nofollow noopener noreferrer">"12.5.1 String Comparison Functions" ist im Handbuch frei zugänglich</a>. Insoweit habe ich mich erst einmal streng an die ursprüngliche Aufgabe <em>"Verhindern des Eintrags eines leeren Strings"</em> gehalten und für alles (selbst mit trüber Glaskugel) erwartbare den Tipp mit dem Regex nachgereicht.</p> https://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746789#m1746789 Rolf B 2019-04-15T07:45:19Z 2019-04-15T07:45:19Z 2. Funktionierende Lösung: Procedur und Trigger ( + mehrere Tests + Regex ) <p>Hallo Self-Nachtwächter,</p> <blockquote> <p>„gründlich missglückte Besserwisserei“</p> </blockquote> <p>Oder eine Nachfrage wegen einer Wissenslücke. Ich musste ja auch erstmal nachlesen und war verblüfft, dass es diesen Unterschied gibt.</p> <p>Das gehört sicherlich zu den unbekannteren Eigenschaften von SQL und bin über diese Frage eigentlich ganz froh, ich habe etwas dadurch gelernt. Kurze Umfrage unter Kollegen ergab, dass ich damit nicht allein war. Eine Rückfrage war "LIKE ohne Pattern? Gibt das keinen Fehler?"...</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div>