spalte werte

Kurzer Einwand : WHERE TRIM(column4) is kein so gute Idee, da dei DB keinen Index auf column4 verwenden kann, ..snip..

Besser ist es die Tabelle zu bereinigen, damit "IS NOT NULL" verwenden kann und somit der Index auch genutzt wird.
Naja, wir sind ja offensichtlich noch in der Findungsphase. Ich habe ein Beispiel für eine Mögliche Nutzung von trim() und is null geben. Das muss man jetzt nicht frühzeitig optimieren.

Dein Einwand ist natürlich vollkommen richtig!

Und jetzt noch eine kleinkarierte Frage:
Wie würdest Du bei einer Bereinigung, die fragwürdigen Elemente finden?
Und komm mir jetzt bitte nicht mit Trim oder anderen Funktionen! ;)
 
Werbung:
So was wie update my table set Feld = TRIM(Feld)
Naja, wir sind ja offensichtlich noch in der Findungsphase. Ich habe ein Beispiel für eine Mögliche Nutzung von trim() und is null geben. Das muss man jetzt nicht frühzeitig optimieren.

Dein Einwand ist natürlich vollkommen richtig!

Und jetzt noch eine kleinkarierte Frage:
Wie würdest Du bei einer Bereinigung, die fragwürdigen Elemente finden?
Und komm mir jetzt bitte nicht mit Trim oder anderen Funktionen! ;)

Ohje, Das ist keine Optimierung! Das ist ein Falsches Design. Warum Usern erst alles falsch zeigen. Besser ist doch wenn sie es von Anfang an richtig machen.

Aber zu deiner Frage der Bereinigung. Kurze Frage und längere Antwort.
Das hängt ganz vom der Struktur der Tabelle ab. Ob der User CHAR, VARCHAR und DEFAULT verwendet hat.


Code:
CREATE TABLE `tabCharTest` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `colChar` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `colVarChar` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `colVarCharNN` varchar(32) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `col5` (`colChar`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO tabCharTest VALUES
(1,    'ABC'    , 'ABC'   , 'ABC'    ),
(2,    'ABC '    , 'ABC '  , 'ABC '    ),
(3,    ' ABC '    , ' ABC ' , ' ABC '    ),
(4,    '   '    , '   '      , '   '    ),
(5,    ''        , ''      , ''        );
(6,    NULL    , NULL      , ''        );


SELECT id
  , colChar , LENGTH(colChar) AS colChar
  , colVarChar AS colVarChar, LENGTH(colVarChar)
  , colVarCharNN AS colVarCharNN, LENGTH(colVarCharNN)
FROM tabCharTest;


Da kommt denn sowas raus:

Code:
mysql> SELECT id
    ->   , colChar , LENGTH(colChar) AS colChar
    ->   , colVarChar AS colVarChar, LENGTH(colVarChar)
    ->   , colVarCharNN AS colVarCharNN, LENGTH(colVarCharNN)
    -> FROM tabCharTest;
+----+---------+---------+------------+--------------------+--------------+----------------------+
| id | colChar | colChar | colVarChar | LENGTH(colVarChar) | colVarCharNN | LENGTH(colVarCharNN) |
+----+---------+---------+------------+--------------------+--------------+----------------------+
|  1 | ABC     |       3 | ABC        |                  3 | ABC          |                    3 |
|  2 | ABC     |       3 | ABC        |                  4 | ABC          |                    4 |
|  3 |  ABC    |       4 |  ABC       |                  5 |  ABC         |                    5 |
|  4 |         |       0 |            |                  3 |              |                    3 |
|  5 |         |       0 |            |                  0 |              |                    0 |
+----+---------+---------+------------+--------------------+--------------+----------------------+
5 rows in set (0.00 sec)

mysql>

Da sieht man die Unterschiede. Z.B. wenn du bei CHAR Leerzeichen speichern willst ist die Länge 0 usw.

Wichtig ist aber das man die Applikation zuerst so abändert das keine Leerzeichen mehr gespeichert. Also TRIM() bei INSERT und UPDATE

danach kann man bereinigen z.b UPDATE tabelle set col5 = TRIM( col5);


etc.
 
Gut, das kann man alles analysieren.
Aber dann:
UPDATE tabelle set col5 = TRIM( col5);
Ohne Where Clause?

Die Sache ging damit los, dass mein Beispiel wegen nicht nutzbarer Indexverwendung getadelt wurde, nur mal als Erinnerung. Und Du propagierst, gleich alles richtig zu zeigen ...

Mit Deiner Analyse machst Du nun die ein oder andere Length Abfrage, geschenkt, erzeugst eine komplete Tabelle und am Ende ein unconditional Update, das sowohl sowohl Werte ändert, die gar nicht geändert werden müssen, als auch Werte, die nicht mal existieren.
Ohne Where Clause.
War es nicht ausdrücklich eine große Tabelle? Das Backup freut sich!
Da kann ich nur sagen, in dem Fall braucht man natürlich auch keinen Index, wahrscheinlich auch keine Analyse. :|
Und wir hoffen mal, dass kein schlechter OnChange Trigger auf der Spalte ist.

Ach jetzt sehe ich erst, da steht "z.B.", war nur als Beispiel gemeint, genau wie mein Beispiel ...

Happy Halloween!
🎃
 
Tja, genau mein reden, hätte man gezeigt was man hat, hätte man auch eine gezielte Antwort geben können.

und groß ist relativ:wieviel Zeilen, wieviel spalten, welche indexe , etc


OMG:
"Update, das sowohl sowohl Werte ändert, die gar nicht geändert werden müssen, als auch Werte, die nicht mal existieren.
Ohne Where Clause."


Was glaubst du wie MySQL arbeitet ??

schau mal was unter Changed steht. Wenn nix zu ändern gibt, scheibt MySQL auch nicht. Nur mal so.

Code:
mysql> update tabCharTest set colChar = TRIM(colChar);
Query OK, 1 row affected (0.06 sec)
Rows matched: 5  Changed: 1  Warnings: 0

mysql> update tabCharTest set colChar = TRIM(colChar);
Query OK, 0 rows affected (0.00 sec)
Rows matched: 5  Changed: 0  Warnings: 0

mysql>


Dir auch noch

Happy Halloween!
🎃
 
Ich frage mich, was man unter "leere Stellen" verstehen soll...
Eine Stelle mit einem "Leerzeichen" ist bereits gefüllt (nämlich mit einem Leerzeichen)

Der Wert NULL wäre ein absolut nicht vorhandener Wert, nichteinmal ein Leerzeichen ;)

aber auf die schnelle:
Code:
test=# select * from notablegiven;
 column1 | column2 | column3 | column4
---------+---------+---------+---------
       1 | 2       | 3       | 4
       2 | 2a      | 3b      |
       3 | 3a      | 3b      |
(3 Zeilen)

test=# select * from notablegiven where column4 is not null and column4 != ' ';
 column1 | column2 | column3 | column4
---------+---------+---------+---------
       1 | 2       | 3       | 4
(1 Zeile)

EDIT: In der gegebenen Tabelle sind Leerzeichen in den (offenbar) leeren Zellen.
dann bekomme ich Spalte 4 ganz leer
 
column1column2
value
145​
value
145​
value2
13​
value2
56​
value2
364​

wie man Kombinationen bekommt
Result
145​
Result
14516​
Result
145364​
 
Werbung:
Zurück
Oben