<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alt om ingenting og litt i mellom &#187; integritet</title>
	<atom:link href="http://hovenko.no/blog/tag/integritet/feed/" rel="self" type="application/rss+xml" />
	<link>https://hovenko.no/blog</link>
	<description>En blogg av Knut-Olav</description>
	<lastBuildDate>Mon, 10 Mar 2025 19:25:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Fortsetter jakten på MySQL-features</title>
		<link>https://hovenko.no/blog/2009/11/05/fortsetter-jakten-pa-mysql-features/</link>
		<comments>https://hovenko.no/blog/2009/11/05/fortsetter-jakten-pa-mysql-features/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 21:17:08 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[integritet]]></category>
		<category><![CDATA[kode]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=385</guid>
		<description><![CDATA[I dag kom jeg over noe merkelige greier i MySQL. I en SELECT-spørring hvor jeg bruker WHERE for å søke etter strenger, så betyr det ingenting om jeg spør mot en tom streng eller masse mellomrom. Jeg har en tabell som heter &#8220;texts&#8221; med kolonnene &#8220;uuid&#8221;, &#8220;name&#8221; og &#8220;content&#8221;. Feltet &#8220;content&#8221; er av type TEXT [...]]]></description>
			<content:encoded><![CDATA[<p>I dag kom jeg over noe merkelige greier i MySQL.</p>
<p>I en SELECT-spørring hvor jeg bruker WHERE for å søke etter strenger, så betyr det ingenting om jeg spør mot en tom streng eller masse mellomrom.</p>
<p>Jeg har en tabell som heter &#8220;texts&#8221; med kolonnene &#8220;uuid&#8221;, &#8220;name&#8221; og &#8220;content&#8221;. Feltet &#8220;content&#8221; er av type TEXT fordi jeg har behov for å lagre et ukjent antall tegn med tekst her.</p>
<div class="mysql-code">
<pre class="hl"><code>
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| uuid         | varchar(36)  | NO   | PRI |         |       |
| name         | varchar(16)  | NO   |     |         |       |
| content      | text         | NO   |     |         |       |
+--------------+--------------+------+-----+---------+-------+
</code></pre>
</div>
<p>Først testet jeg med en tom streng:</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> SELECT uuid,name,content FROM texts \
    -> WHERE content = "";
+--------------------------------------+-------------+---------+
| uuid                                 | name        | content |
+--------------------------------------+-------------+---------+
| 1b74168e-5b91-4c27-b1eb-257d6d0cee18 | description |         |
| 963c7f0a-e0dc-45e5-af5b-a803dee3a743 | arrival     |         |
| a7bf022e-fc95-4410-bd6e-e92b64f12db4 | regulation  |         |
| ebffc5bb-b3f8-473d-8f34-a5041f73987c | sanitation  |         |
+--------------------------------------+-------------+---------+
4 rows in set (0.00 sec)
</code></pre>
</div>
<p>Deretter forsøkte jeg bare for moro skyld å søke etter tre mellomrom:</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> SELECT uuid,name,content FROM texts \
    -> WHERE content = "   ";
+--------------------------------------+-------------+---------+
| uuid                                 | name        | content |
+--------------------------------------+-------------+---------+
| 1b74168e-5b91-4c27-b1eb-257d6d0cee18 | description |         |
| 963c7f0a-e0dc-45e5-af5b-a803dee3a743 | arrival     |         |
| a7bf022e-fc95-4410-bd6e-e92b64f12db4 | regulation  |         |
| ebffc5bb-b3f8-473d-8f34-a5041f73987c | sanitation  |         |
+--------------------------------------+-------------+---------+
4 rows in set (0.00 sec)
</code></pre>
</div>
<p>Men for all del da? Dette er jo samme resultatet som ovenfor.</p>
<p>Eller hva med denne spørringen? Jeg kan ikke skjønne hvorfor det er slik. En tom streng er ikke det samme som tre spacer!</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> SELECT uuid,name,content FROM texts \
    -> WHERE content = "   " AND content = "";
+--------------------------------------+-------------+---------+
| uuid                                 | name        | content |
+--------------------------------------+-------------+---------+
| 1b74168e-5b91-4c27-b1eb-257d6d0cee18 | description |         |
| 963c7f0a-e0dc-45e5-af5b-a803dee3a743 | arrival     |         |
| a7bf022e-fc95-4410-bd6e-e92b64f12db4 | regulation  |         |
| ebffc5bb-b3f8-473d-8f34-a5041f73987c | sanitation  |         |
+--------------------------------------+-------------+---------+
4 rows in set (0.00 sec)
</code></pre>
</div>
<p>Hvorfor i alle dager gjør MySQL dette her mot meg?</p>
<p>Én teori jeg har er at MySQL skal hjelpe meg som en dum utvikler i å returnere det korrekte svaret selv om jeg skulle skrevet inn et mellomrom for mye i søkefeltet mitt. Akkurat i samme stil som de andre gangene <a href="http://hovenko.no/blog/tag/mysql/" title="Innlegg tagget med MySQL">MySQL har vært så hjelpsom mot meg</a>&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2009/11/05/fortsetter-jakten-pa-mysql-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL på nye fremmednøkkeleventyr</title>
		<link>https://hovenko.no/blog/2009/10/13/mysql-pa-nye-fremmednokkeleventyr/</link>
		<comments>https://hovenko.no/blog/2009/10/13/mysql-pa-nye-fremmednokkeleventyr/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 20:23:17 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[integritet]]></category>
		<category><![CDATA[kode]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[relasjoner]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=361</guid>
		<description><![CDATA[Ikke så lenge siden skrev jeg om MySQL sine problemer med datatyper og NULL-konstraints. Og problemene stopper ikke der. Jeg kom i dag over en merkelig og helt uforståelig bug i MySQL. Eller, det heter vel kanskje feature når det gjelder MySQL. Ta følgende scenario: En kolonne &#8220;disabled_reason_ref&#8221; i tabellen &#8220;countries&#8221; refererer til feltet &#8220;uuid&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Ikke så lenge siden skrev jeg om <a href="http://hovenko.no/blog/2009/10/03/mysql-mangel-pa-integritet/" title="MySQL - mangel på integritet">MySQL sine problemer med datatyper og NULL-konstraints</a>. Og problemene stopper ikke der.</p>
<p>Jeg kom i dag over en merkelig og helt uforståelig bug i MySQL. Eller, det heter vel kanskje feature når det gjelder MySQL.</p>
<p>Ta følgende scenario: En kolonne &#8220;disabled_reason_ref&#8221; i tabellen &#8220;countries&#8221; refererer til feltet &#8220;uuid&#8221; i tabellen &#8220;texts&#8221;. Kolonnen &#8220;disabled_reason_ref&#8221; er definert med mindre størrelse enn feltet den refererer til. Dette visste jeg ikke om. Begge tabellene bruker InnoDB og det er satt opp fremmednøkler. Hvordan dette gir noe som helst mening i MySQL-verden vet jeg ikke.</p>
<p>Ihvertfall. Det hele startet med denne SQL INSERT-spørringen.</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> INSERT INTO countries (uuid, country_code, disabled, disabled_reason_ref, page_ref) VALUES ("a63d5a26-9719-47dd-9617-c07bd8126061", "NO", 1, "e80c8d7c-dd84-4a4f-8df4-778efe9b311a", NULL);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`utenlandsbolig/countries`, CONSTRAINT `countries_ibfk_2` FOREIGN KEY (`disabled_reason_ref`) REFERENCES `texts` (`uuid`))
</code></pre>
</div>
<p>Det er <strong>ingenting</strong> i feilmeldingen fra denne spørringen som sier noe om det.</p>
<p>Jeg lurte litt på om kolonnenavnet var for langt, så jeg lagde en ny kolonne som heter &#8220;reason_ref&#8221;.</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> alter table countries add column  reason_ref VARCHAR(32)  REFERENCES texts(uuid);
Query OK, 1 row affected (0.52 sec)
Records: 1  Duplicates: 0  Warnings: 0
</code></pre>
</div>
<p>MySQL satte riktignok ikke opp noen fremmednøkkel her, noe jeg sjekket med &#8220;SHOW CREATE TABLE countries&#8221;.<br />
Lurer da fælt på hva den i så fall referer til&#8230;<br />
Vel, MySQL er MySQL.</p>
<p>Jeg tenkte så at jeg ikke trengte &#8220;disabled_reason_ref&#8221; lenger.</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> alter table countries drop column disabled_reason_ref;
ERROR 1025 (HY000): Error on rename of './utenlandsbolig/#sql-4fa3_6' to './utenlandsbolig/countries' (errno: 150)
</code></pre>
</div>
<p>Hva i alle dager betyr dette?<br />
Jeg kom meg ikke rundt feilen, så jeg lot kolonnen bare ligge.</p>
<p>Jeg hadde på dette tidspunktet ikke oppdaget at &#8220;reason_ref&#8221; var for liten. Kolonnen den refererer til er nemlig av type <strong>VARCHAR(36)</strong>.</p>
<p>Et nytt forsøk på INSERT, nå ved å bruke den nye kolonnen.</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> INSERT INTO countries (uuid, country_code, disabled, reason_ref, page_ref) VALUES ("a63d5a26-9719-47dd-9617-c07bd8126061", "NO", 1, "e80c8d7c-dd84-4a4f-8df4-778efe9b311a", NULL);
Query OK, 1 row affected, 1 warning (0.19 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------+
| Level   | Code | Message                                         |
+---------+------+-------------------------------------------------+
| Warning | 1265 | Data truncated for column 'reason_ref' at row 1 |
+---------+------+-------------------------------------------------+
1 row in set (0.00 sec)
</code></pre>
</div>
<p>Og det viste seg at kolonnen var for liten. Dermed fant den ingen rad i &#8220;texts&#8221;-tabellen som hadde den refererte verdien på 32 tegn, da verdien egentlig skulle vært på 36 tegn.</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> alter table countries modify column disabled_reason_ref varchar(36);
Query OK, 2 rows affected (0.40 sec)
Records: 2  Duplicates: 0  Warnings: 0
</code></pre>
</div>
<p>Greit at det var jeg som gjorde feilen med å deklarere kolonnen for liten.<br />
Men hallooo, litt hjelp kan man vel få fra en database? Spesielt fra en relasjonsdatabase!</p>
<p>Dumme MySQL!</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2009/10/13/mysql-pa-nye-fremmednokkeleventyr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL &#8211; mangel på integritet</title>
		<link>https://hovenko.no/blog/2009/10/03/mysql-mangel-pa-integritet/</link>
		<comments>https://hovenko.no/blog/2009/10/03/mysql-mangel-pa-integritet/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 09:55:36 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[integritet]]></category>
		<category><![CDATA[kode]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=352</guid>
		<description><![CDATA[MySQL gjør mye rart. Her har vi en ganske normal tabell, med kolonner som krever en verdi og med kolonner av forskjellige datatyper. Fire av kolonnene i tabellen kan ta default verdier, resten kan det ikke. mysql> DESC user_status; +-------------------+--------------+------+-----+---------+-------+ &#124; Field &#124; Type &#124; Null &#124; Key &#124; Default &#124; Extra &#124; +-------------------+--------------+------+-----+---------+-------+ &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL gjør mye rart. Her har vi en ganske normal tabell, med kolonner som krever en verdi og med kolonner av forskjellige datatyper. Fire av kolonnene i tabellen kan ta default verdier, resten kan det ikke.</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> DESC user_status;
+-------------------+--------------+------+-----+---------+-------+
| Field             | Type         | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| uid               | int(10)      | NO   | PRI | NULL    |       |
| verified          | tinyint(1)   | NO   |     | 0       |       |
| registered_nick   | tinyint(1)   | NO   |     | 0       |       |
| first_time        | tinyint(1)   | NO   |     | 1       |       |
| registration_date | datetime     | NO   |     | NULL    |       |
| verification_code | int(10)      | NO   |     | NULL    |       |
| nick              | varchar(32)  | NO   |     | NULL    |       |
| active            | tinyint(1)   | NO   |     | 1       |       |
| ban_reason        | varchar(255) | NO   |     | NULL    |       |
| logincount        | int(11)      | NO   |     | NULL    |       |
| lastlogin         | datetime     | NO   |     | NULL    |       |
+-------------------+--------------+------+-----+---------+-------+
</code></pre>
</div>
<p>Så legger vi inn en rad i tabellen. Legg merke til at vi bare legger inn data i noen av kolonnene.</p>
<div class="mysql-code">
<pre class="hl"><code>
INSERT INTO user_status(
  uid, verified, registration_date,
  verification_code, nick)
VALUES(1, 1, NOW(), "asd", "ut");
</code></pre>
</div>
<p>Så får jeg en suksessmelding tilbake fra MySQL, jippi. Eller vent, det står noe om at det er generert tre advarsler. Ok tenker jeg, så jeg får vel finne ut hva disse advarslene er.</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------+
| Level   | Code | Message                                                                |
+---------+------+------------------------------------------------------------------------+
| Warning | 1364 | Field 'ban_reason' doesn't have a default value                        |
| Warning | 1364 | Field 'logincount' doesn't have a default value                        |
| Warning | 1364 | Field 'lastlogin' doesn't have a default value                         |
| Warning | 1366 | Incorrect integer value: 'asd' for column 'verification_code' at row 1 |
+---------+------+------------------------------------------------------------------------+
</code></pre>
</div>
<p>Det at MySQL gir blaffen i påkrevde kolonner visste jeg egentlig, og jeg blir sinna hver gang jeg tenker på det. Så egentlig var de første advarslene godt kjente for meg.</p>
<p>Det som virkelig overrasket meg var,</p>
<blockquote><p>Hva?! Tillater MySQL meg å opprette en rad i en tabell med noe data i en kollonne med en annen datatype?</p></blockquote>
<p>MySQL tillater meg faktisk å sende inn tekststrengen &#8220;asd&#8221; inn kolonnen &#8220;verification_code&#8221; som er deklarert som et heltall. Hva i alle dager? Hvilken verdi har MySQL satt inn i tabellen min da? Dette må undersøkes.</p>
<div class="mysql-code">
<pre class="hl"><code>
mysql> SELECT * FROM user_status;
+-----+----------+-----------------+------------+---------------------+-------------------+------+--------+------------+------------+---------------------+
| uid | verified | registered_nick | first_time | registration_date   | verification_code | nick | active | ban_reason | logincount | lastlogin           |
+-----+----------+-----------------+------------+---------------------+-------------------+------+--------+------------+------------+---------------------+
|   1 |        1 |               0 |          1 | 2009-09-29 17:08:57 |                 0 | ut   |      1 |            |          0 | 0000-00-00 00:00:00 |
+-----+----------+-----------------+------------+---------------------+-------------------+------+--------+------------+------------+---------------------+
</code></pre>
</div>
<p>Den satte inn tallet &#8220;0&#8243; i verification_code-kolonnen. Hvordan MySQL fant ut at det var en smart idé vet jeg ikke. Kolonnen er av type heltall, den krever en verdi og er deklarert uten noen default verdi. Jeg sender inn tekststrengen &#8220;asd&#8221;.</p>
<p>I et scriptspråk som PHP eller Perl evalueres denne strengen til en bolsk sann verdi. Så kanskje kunne heltallsrepresentasjonen av strengen vært &#8220;1&#8243;. Derimot er det ikke sikkert at kolonnen representerer en bolsk verdi, for da ville jeg vel brukt en datatype som bit eller bool, ikke sant? Det eneste fornuftige å gjøre er faktisk å ikke tillate verdien og forhindre meg i å opprette raden.</p>
<p>Det jeg stusser litt på, og blir lei meg over, er den manglende forståelsen av integritet i MySQL. Hvis jeg forsøker å opprette en rad i en tabell uten å sende inn alle påkrevde felt, så burde jeg ikke få lov til å opprette raden. Så enkelt kan det gjøres.</p>
<p>MySQL må ikke tro at den er smartere enn meg.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2009/10/03/mysql-mangel-pa-integritet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
