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 characters?
我可以在这里查看字节表示 中西里尔符号的含义吗?
答案 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