2017-12-20 4 views
2
mysql>show full columns from bpsw; 
+--------+------------------+-----------+------+-----+---------+----------------+---------------------------------+---------+ 
| Field | Type    | Collation | Null | Key | Default | Extra   | Privileges      | Comment | 
+--------+------------------+-----------+------+-----+---------+----------------+---------------------------------+---------+ 
| bpswid | int(10) unsigned | NULL  | NO | PRI | NULL | auto_increment | select,insert,update,references |   | 
| badpsw | varchar(128)  | utf8_bin | NO | UNI | NULL |    | select,insert,update,references |   | 
+--------+------------------+-----------+------+-----+---------+----------------+---------------------------------+---------+ 

sagt nicht, mich über not null und default null :)mysql löscht ein kyrillisches Wort wählen Sie ein kyrillisches Wort

mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER()); 
+----------------+-----------------+-------------------+ 
| USER()   | CHARSET(USER()) | COLLATION(USER()) | 
+----------------+-----------------+-------------------+ 
| [email protected] | utf8   | utf8_general_ci | 
+----------------+-----------------+-------------------+ 
1 row in set (0.00 sec) 

Tabelleninhalt:

mysql> select * from bpsw limit X offset XXX ; 
+--------+------------------------+ 
| bpswid | badpsw     | 
+--------+------------------------+ 
| 495883 | by all manner of means | 
| 495884 | by all means   | 
| 495885 | by all odds   | 
| 495886 | by an ace    | 
| 495887 | by an iota    | 
| 495888 | by and by    | 
| 495889 | by and large   | 
| 495890 | by any chance   | 
| 495891 | by any manner of means | 
| 495892 | by any means   | 
+--------+------------------------+ 
... 
| 94950 | яростных             | 
| 1599 | ярь-медянка             | 
| 1600 | ястреб-перепелятник           | 
| 1601 | ястреб-тетеревятник           | 
| 94999 | яфетический             | 
| 1603 | яхт-клуб             | 
| 1604 | яхт-клуба             | 
... 
| 1938 | яванский желоб            | 
| 1939 | яванское море            | 
| 94690 | еще какое-то слово           | 
| 1940 | яде-бузен залив            | 
| 94751 | ядерного             | 
| 94755 | раз два-три             | 

Notwendigkeit: wählen oder aus dem Tisch cyril entfernen lic Wörter.

ist es notwendig, die Zeilen zu löschen, in denen ONE Cyrillic word WITHOUT Ziffer, ohne spezielle Zeichen, ohne Zeichen der Satzzeichen.

Bedingung für die Entfernung: '^ [а-я] + [а-я] $ +'

select * from bpsw where badpsw regexp '^[a-z]+[a-z]$+'; 

mit englischen Worten gibt es keine Probleme, aber mit dem kyrillischen Alphabet werde ich verstehe nicht, wie es machen.

Ich denke, dass es notwendig ist, eine Kollate anzugeben?

UPD:mysql regex utf-8 characters?

hier kann ich brauche an der Bedeutung der Kyrillisch Symbole in der Bytedarstellung aussehen?

+0

ein Muster Zeichen aus Wörtern Geben Sie löschen möchten. –

+0

Oder Geben Sie eine klare Liste Beispiel, das Sie löschen möchten. –

+0

@reds ,, https://ru.wikipedia.org/wiki/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0% D0% BB% D1% 84% D0% B0% D0% B2% D0% B8% D1% 82 alle in Klein а б в г д е ж з и й к л м н о п р с т у ф ч .. .. –

Antwort

0

Versuchen Sie, einen Blick auf diese nehmen:

Ist das der Datensatz, den Sie löschen möchten?

select bpswid,badpsw from Your_Table 
where badpsw like '%б%' or badpsw like '%в%' 
or badpsw like '%г%' 
or badpsw like '%д%' 
or badpsw like '%ё%' 
or badpsw like '%ж%' 
or badpsw like '%з%' 
or badpsw like '%и%' 
or badpsw like '%й%' 
or badpsw like '%к%' 
or badpsw like '%л%' 
or badpsw like '%м%' 
or badpsw like '%н%' 
or badpsw like '%п%' 
or badpsw like '%т%' 
or badpsw like '%ф%' 
or badpsw like '%у%' 
or badpsw like '%ц%' 
or badpsw like '%ч%' 
or badpsw like '%ш%' 
or badpsw like '%щ%' 
or badpsw like '%ъ%' 
or badpsw like '%ы%' 
or badpsw like '%ь%' 
or badpsw like '%э%' 
or badpsw like '%ю%' 
or badpsw like '%я%' 
or badpsw like '%с%' 
or badpsw like '%р%' 
or badpsw like '%х%' 
or badpsw like '%е%' 
or badpsw like '%о%' 

Ergebnis:

94950 яростных 
1599 ярь-медянка 
1600 ястреб-перепелятник 
1601 ястреб-тетеревятник 
94999 яфетический 
1603 яхт-клуб 
1604 яхт-клуба 
1938 яванский желоб 
1939 яванское море 
94690 еще какое-то слово 
1940 яде-бузен залив 
94751 ядерного 
94755 раз два-три 

wenn nicht, dann entfernen Sie einfach das andere in ähnlichen Zustand. Fahren Sie dann mit dem Löschen des Datensatzes fort.

+0

:(Nein. Ich habe es nicht einmal überprüft. Ihr Beispiel löscht alle Wörter. ** Zu wählende Wörter sind: 'яростных яфетический ядерного' ** Tabelle' bpsw'konsistent über 1000000 Wörter. –

+0

was meinst du entfernen? entfernt, aber die Zeilen noch vorhanden? –

+0

Ich habe es nicht einmal überprüft –

1

SELECT USER(), CHARSET(USER()), COLLATION(USER()); sagt so gut wie nichts. USER() gibt eine Zeichenfolge zurück, die durch die Tabelle definiert ist, aus der "user" stammt. Es ist immer utf8.

Vielleicht, was Sie wollen, ist

mysql> SHOW VARIABLES LIKE 'char%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8mb4     | 
| character_set_connection | utf8mb4     | 
| character_set_database | utf8mb4     | 
| character_set_filesystem | binary      | 
| character_set_results | utf8mb4     | 
| character_set_server  | utf8mb4     | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.00 sec) 

REGEXP arbeitet nur mit Bytes, nicht Nicht-ASCII-Zeichen, wie die 2-Byte-Kyrillisch UTF8-Zeichen. (Aktuelle MariaDB Versionen können behandeln wie.

)

Statt SHOW FULL COLUMNS... verwenden SHOW CREATE TABLE... - die es noch deutlicher machen, ob die Spalten NOT NULL oder NULL sind. Dies kann kyrillischen Zeichenketten entdecken

:

WHERE HEX(col) REGEXP '^(..)*D[0-4]' 

weil in UTF-8, alle kyrillischen Zeichen sind 2 Bytes, von denen die erste ist HEX D0, D1, D2, D3, D4 oder.

SELECT HEX('яростных') REGEXP '^(..)*D[0-4]'; ->1

Sie wollen Kyrillisch "entfernen"? Wenn Sie die Zeilen entfernen möchten, genügt eine DELETE mit dieser WHERE. Wenn Sie den Text bearbeiten möchten, nimmt das den Anwendungscode (es sei denn, Sie haben MariaDB und können REGEXP_REPLACE() verwenden).

Habe ich alle Fragen angesprochen?

bearbeiten

die Zeile zu löschen, wo col1nur ein einziges Kyrillisch Wort enthält,

DELETE FROM tbl 
    WHERE HEX(col1) REGEXP '^(D[0-4]..)+$'; 
+0

danke für die ausführliche Erklärung Ich habe dieses" Problem "bereits gelöst Es war notwendig ** nicht nur das kyrillische Alphabet ** zu löschen, sondern 'die Zeilen zu löschen, die MIT EINEM kyrillischen Wort sind OHNE Leerzeichen, WITHOU T Bindestriche, OHNE spezielle Zeichen –

+0

@root_xPovierennyy - Ich habe die Regexp dafür hinzugefügt. –

+0

%) Ich habe stattdessen das gesamte kyrillische Alphabet aufgelistet. regexp '^ [абвгдеёжзийклмнопрстуфхцчшъъыьэюя] + $'; Ich bin so klarer. Und mit Kodierungen (genauer gesagt mit Bytes) - das ist schrecklich:;)) –