【问题标题】:mysql delete one cyrillic word select one cyrillic wordmysql 删除一个西里尔字母 选择一个西里尔字母
【发布时间】:2018-06-02 11:53:03
【问题描述】:
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 ?

这里我需要看看字节表示中的西里尔符号的含义吗?

【问题讨论】:

  • 从你想删除的单词中给出一个示例字符。
  • 或者给出一个清晰的列表你想删除的例子。
  • @reds,, ru.wikipedia.org/wiki/… 全部小写 а б в г д е ж з и й к л м н о п р с т у ф ч ....
  • 所有这些字符都将被删除?
  • @reds "删除 ONE Cyrillic word WITHOUT digit, without special chars, without chars of punctuation 的行。"我可以不进行字节比较吗?

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


【解决方案1】:

很简单:

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

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

【讨论】:

    【解决方案2】:

    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)
    

    REGEXPbytes 一起工作,而不是非 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

    您想“删除”西里尔字母吗?如果要删除行,则带有 WHEREDELETE 就足够了。如果您想编辑文本,则需要应用程序代码(除非您有 MariaDB 并且可以使用 REGEXP_REPLACE())。

    我是否解决了所有问题?

    编辑

    要删除 col1 包含一个西里尔字母的行,

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

    【讨论】:

    • 感谢您的详细解释。我已经解决了这个“问题”。 不仅要删除西里尔字母,还要删除to delete the rows that are WITH ONE Cyrillic word 没有空格、没有连字符、没有特殊字符。
    • @root_xPovierennyy - 我为此添加了正则表达式。
    • %) 我列出了整个西里尔字母。正则表达式 '^[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+$';我更清楚了。并且使用编码(更准确地说是字节) - 这太可怕了:;))
    • @root_xPovierennyy - 是的,我的解决方案很糟糕。但它有效。您的REGEXP 可能与其他非英语语言不匹配。
    【解决方案3】:

    试着看看这个:

    这是您要删除的记录吗?

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

    如果不是,那么只需在类似的情况下删除另一个。然后继续删除记录。

    【讨论】:

    • :( 没有。我什至没有检查它。您的示例将删除所有单词。要选择的单词是:яростных яфетический ядерногоbpswconsist 大约有 1000000 个单词。
    • 删除是什么意思?它已删除,但行仍然存在?
    • 我什至没有检查它
    • 对不起,我什至没有明白你的意思。
    • 知道这个词是如何被删除的吗? яростных яфетический ядерного
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多