mysql удалить одно кириллическое слово выбрать одно кириллическое слово

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 |         |
+--------+------------------+-----------+------+-----+---------+----------------+---------------------------------+---------+

не говорите мне про not null и default null :)

mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER());
+----------------+-----------------+-------------------+
| USER()         | CHARSET(USER()) | COLLATION(USER()) |
+----------------+-----------------+-------------------+
| root@localhost | utf8            | utf8_general_ci   |
+----------------+-----------------+-------------------+
1 row in set (0.00 sec)

содержимое таблицы:

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 | раз два-три                                                 | 

нужно: выделить или удалить из таблицы кириллические слова.

необходимо удалить строки, в которых ONE Cyrillic word WITHOUT цифра, без спецсимволов, без знаков препинания.

Условие удаления: '^[а-я]+[а-я]$+'

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

С английскими словами проблем нет, а вот с кириллицей не пойму, КАК это сделать.

Я думаю, что надо указать сортировку?

UPD: mysql regex utf-8 символов?

может здесь мне нужно посмотреть значения кириллицы в байтовом представлении?


person Aliskin    schedule 20.12.2017    source источник
comment
Дайте образец символа из слов, которые вы хотите удалить.   -  person Vijunav Vastivch    schedule 20.12.2017
comment
Или Дайте четкий список примеров, которые вы хотите удалить.   -  person Vijunav Vastivch    schedule 20.12.2017
comment
@reds,, ru.wikipedia.org/wiki/ все в нижнем регистре а б в г д е ж з и й к л м н о п р с т у ф ч ....   -  person Aliskin    schedule 20.12.2017
comment
Все эти персонажи должны быть удалены?   -  person Vijunav Vastivch    schedule 20.12.2017
comment
@reds для удаления строк, в которых ОДНО кириллическое слово БЕЗ цифр, без спецсимволов, без знаков препинания. можно ли обойтись без сравнения байтов?   -  person Aliskin    schedule 20.12.2017
comment
Как, например? можешь показать здесь? пример слова? Любые?   -  person Vijunav Vastivch    schedule 20.12.2017
comment
Вы имеете в виду, что все это должно быть удалено? `94950 | яростных 1599 | яр-медянка 1600 | ястреб-перепелятник 1601 | ястреб-тетеревятник 94999 | яфетический 1603 | яхт-клуб 1604 | яхт-клуб ... | 1938 | яванский желоб | 1939 | яванское море | 94690 | еще какое-то слово | 1940 | заливка яде-бузен | 94751 | кредит | 94755 | раз два-три   -  person Vijunav Vastivch    schedule 20.12.2017
comment
символы: а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я   -  person Aliskin    schedule 20.12.2017
comment
слова для удаления: | яростных | яфетический | кредит |   -  person Aliskin    schedule 20.12.2017
comment
@reds UPD: stackoverflow. com/questions/19774618/ ? может здесь надо посмотреть значения кириллицы в байтовом представлении?   -  person Aliskin    schedule 20.12.2017


Ответы (3)


Это просто:

select * from bpsw where badpsw regexp '^[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+$'; 

https://linux.org.ua/index.php?topic=11272.msg201662#msg201662

person Aliskin    schedule 20.12.2017

SELECT USER(), CHARSET(USER()), COLLATION(USER()); практически ничего не говорит. USER() возвращает строку, определенную таблицей, из которой исходит «пользователь». Это всегда utf8.

Возможно, то, что вы хотите, это

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 работает только с байтами, а не с символами, отличными от ascii, такими как 2-байтовые символы кириллицы utf8. (Последние версии MariaDB могут с этим справиться.)

Вместо SHOW FULL COLUMNS... используйте SHOW CREATE TABLE... -- это сделает более очевидным, являются ли столбцы NOT NULL или NULL.

Это может обнаружить кириллические строки:

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

потому что в utf8 все кириллические символы занимают 2 байта, первый из которых HEX D0, D1, D2, D3 или D4.

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

Вы хотите "убрать" кириллицу? Если вы хотите удалить строки, то DELETE с этим WHERE будет достаточно. Если вы хотите отредактировать текст, для этого потребуется код приложения (если у вас нет MariaDB и вы не можете использовать REGEXP_REPLACE()).

Я рассмотрел все вопросы?

Изменить

Чтобы удалить строку, в которой col1 содержит только одно кириллическое слово,

 DELETE FROM tbl
     WHERE HEX(col1) REGEXP '^(D[0-4]..)+$';
person Rick James    schedule 22.12.2017
comment
спасибо за подробное объяснение. Я уже решил эту проблему. Нужно было не просто удалить кириллицу, а to delete the rows that are WITH ONE Cyrillic word БЕЗ пробелов, БЕЗ дефисов, БЕЗ специальных символов. - person Aliskin; 23.12.2017
comment
@root_xPovierennyy - для этого я добавил регулярное выражение. - person Rick James; 23.12.2017
comment
%) Вместо этого я указал всю кириллицу. регулярное выражение '^[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+$'; Я так более ясно. А с кодировками (точнее с байтами) - это ужас:;)) - person Aliskin; 24.12.2017
comment
@root_xPovierennyy - Да, мое решение ужасно. Но это работает. Ваш REGEXP может неправильно соответствовать другим языкам, отличным от английского. - person Rick James; 24.12.2017

Попробуйте взглянуть на это:

Это запись, которую вы хотите удалить?

 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 '%о%'

Результат:

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

если нет, то просто удалите другой в таком же состоянии. затем продолжите удаление записи.

person Vijunav Vastivch    schedule 20.12.2017
comment
:( нет. Я даже не проверял. Ваш пример удалит все слова. Слова для выбора: яростных яфетический ядерного Таблица bpswсодержит около 1000000 слов. - person Aliskin; 20.12.2017
comment
что значит удалить? он удален, но строки все еще присутствуют? - person Vijunav Vastivch; 20.12.2017
comment
я даже не проверял - person Aliskin; 20.12.2017
comment
Прости, я даже не понимаю, что ты имеешь в виду. - person Vijunav Vastivch; 20.12.2017
comment
есть идеи, как это слово идентифицируется как подлежащее удалению? яростных яфетический ядерного - person Vijunav Vastivch; 20.12.2017
comment
в кириллице '^[а-я]+[а-я]$+' Я спрашиваю, может ли запрос mysql удалить яростных яфетический ядерного из таблицы bpsw. - person Aliskin; 20.12.2017