mysql删除一个西里尔字,选择一个西里尔字

时间:2017-12-20 00:40:12

标签: mysql regex utf-8 character-encoding cyrillic

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 nulldefault 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 characters

我可以在这里查看字节表示西里尔符号的含义吗?

3 个答案:

答案 0 :(得分:1)

SELECT USER(), CHARSET(USER()), COLLATION(USER());几乎没有说什么。 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 bytes ,而不是非ascii字符,例如2字节的Cyrillic 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]..)+$';

答案 1 :(得分:0)

试着看看这个:

这是您要删除的记录吗?

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

如果没有那么只需在相同条件下删除另一个。然后继续删除记录。

答案 2 :(得分:0)

很容易:

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

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