tag:forum.selfhtml.org,2005:/selfMYSQL: NULL != '' – SELFHTML-Forum2019-04-27T10:07:08Zhttps://forum.selfhtml.org/self/2019/apr/13/mysql-null-gleich/1746697#m1746697Matthias Apselmatthias.apsel@selfhtml.orghttps://brückentage.info2019-04-13T10:21:41Z2019-04-13T10:21:41ZMYSQL: 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#m1746698ursus contionabundo2019-04-13T10:35:59Z2019-04-13T10:36:53ZMYSQL: 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#m1746699pl2019-04-13T10:50:19Z2019-04-13T10:50:19ZMYSQL: 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#m1746702Felix Riestererhttps://felix-riesterer.de2019-04-13T11:51:48Z2019-04-13T11:51:48ZMYSQL: 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#m1746754Tabellenkalk2019-04-14T10:42:24Z2019-04-14T10:42:24ZMYSQL: 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#m1746700ursus contionabundo2019-04-13T10:57:04Z2019-04-13T11:16:28ZMö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#m1746705pl2019-04-13T12:23:22Z2019-04-13T12:23:22ZDer 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#m1746704Matthias Apselmatthias.apsel@selfhtml.orghttps://brückentage.info2019-04-13T12:02:07Z2019-04-13T12:02:07ZMYSQL: 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#m1746711pl2019-04-13T14:50:08Z2019-04-13T14:50:08ZMYSQL: 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#m1746706dedlfix2019-04-13T12:40:04Z2019-04-13T12:40:21ZDer 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#m1746733Felix Riestererhttps://felix-riesterer.de2019-04-14T07:34:26Z2019-04-14T07:34:26ZMYSQL: 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#m1746735pl2019-04-14T08:00:35Z2019-04-14T08:04:12ZMYSQL: 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#m1746737Felix Riestererhttps://felix-riesterer.de2019-04-14T08:15:43Z2019-04-14T08:15:43ZMYSQL: 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#m1746742ursus contionabundo2019-04-14T08:45:04Z2019-04-14T08:49:48ZMYSQL: 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#m1746741pl2019-04-14T08:38:27Z2019-04-14T08:47:22ZMYSQL: 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#m1746743pl2019-04-14T08:50:29Z2019-04-14T08:50:29ZMYSQL: 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#m1746746Matthias Apselmatthias.apsel@selfhtml.orghttps://brückentage.info2019-04-14T09:13:20Z2019-04-14T09:13:20ZMYSQL: 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#m1746744ursus contionabundo2019-04-14T08:57:30Z2019-04-14T08:57:30ZMYSQL: 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#m1746750pl2019-04-14T09:52:44Z2019-04-14T09:52:44ZMYSQL: 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#m1746748ursus contionabundo2019-04-14T09:45:31Z2019-04-14T09:53:00ZMYSQL: 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#m1746749Christian Krusehttps://wwwtech.de/about2019-04-14T09:50:33Z2019-04-14T09:50:33ZMYSQL: 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#m1746751ursus contionabundo2019-04-14T09:55:32Z2019-04-14T10:05:44ZMYSQL: 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#m1746762encoder2019-04-14T13:00:34Z2019-04-14T13:00:34ZMYSQL: 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#m1746757ursus contionabundo2019-04-14T10:50:18Z2019-04-14T10:52:02Z2. 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#m1746758Matthias Apselmatthias.apsel@selfhtml.orghttps://brückentage.info2019-04-14T10:52:53Z2019-04-14T10:52:53Z2. 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#m17467591unitedpower2019-04-14T11:09:48Z2019-04-14T11:09:48Z2. 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#m1746760ursus contionabundo2019-04-14T12:03:18Z2019-04-14T12:22:20Z2. 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#m1746761MudGuardhttp://www.andreas-waechter.de/2019-04-14T12:57:35Z2019-04-14T12:57:35Z2. 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#m1747527ursus contionabundo2019-04-27T10:07:08Z2019-04-27T10:07:08Z2. 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#m1746772ursus contionabundo2019-04-14T17:26:42Z2019-04-14T17:27:36Z2. 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#m1746763Christian Krusehttps://wwwtech.de/about2019-04-14T13:42:11Z2019-04-14T13:42:11ZMYSQL: 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#m1746774Rolf B2019-04-14T18:36:20Z2019-04-14T18:36:43Z2. 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#m1746783Self-Nachtwächter2019-04-14T22:24:13Z2019-04-14T22:35:24Z2. 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#m1746789Rolf B2019-04-15T07:45:19Z2019-04-15T07:45:19Z2. 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>