V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
Mindjet
V2EX  ›  MySQL

新手问个关于数据库的幼稚问题

  •  
  •   Mindjet · 2020-05-18 18:41:35 +08:00 · 3013 次点击
    这是一个创建于 1668 天前的主题,其中的信息可能已经有所发展或是发生改变。

    wh_users 表有个 preferences 字段,是二进制内容,其实里面就是文本,下载下来之后就可以看得到。

    想把其中 ID1 的这个 preferences 应用到这个表中的所有对象,请问这个该怎么做呢?

    (刚开始用,遇到了问题,在谷歌上搜「 SQL 复制」,「 SQL 二进制 批量修改」,等等,这样的关键词完全找不到对应的方法,所以来请教,GUI 是 PHPMyAdmin)

    第 1 条附言  ·  2020-05-18 19:38:25 +08:00
    这个数据是用户的配置文件,之后用户还可能会自己修改,所以不能用同一个地址,必须是每个人一份,互相不关联才行。
    第 2 条附言  ·  2020-05-18 19:42:16 +08:00

    情况是这样,这些用户是早期的,他们的消息推送都是关闭的,但现在我想默认开启,所以要批量的修改早期用户配置。

    就是一个批量更改的过程,如果是数组,那么很简单一下就会想到用for,然后每个都赋值,但是SQL二进制文件就不懂了。

    这个需求要尽快实现,自己又没有学过任何SQL语句,而且这个是二进制文件,不是文本,搜了一下也没发现有什么结果,所以就只能来问。

    也学到了一些提问方法,在描述问题的时候,应该把整个背景也放在后面,否则的话是不容易理解的。

    第 3 条附言  ·  2020-05-18 19:53:53 +08:00
    {
        "notify_discussionRenamed_alert": true,
        "notify_postLiked_alert": true,
        "notify_discussionLocked_alert": true,
        "notify_postMentioned_alert": true,
        "notify_postMentioned_email": true,
        "notify_userMentioned_alert": true,
        "notify_userMentioned_email": true,
        "notify_newPost_alert": true,
        "notify_newPost_email": true,
        "notify_userSuspended_alert": true,
        "notify_userUnsuspended_alert": true,
        "notify_selectBestAnswer_alert": true,
        "notify_postReacted_alert": true,
        "followAfterReply": true,
        "discloseOnline": true,
        "indexProfile": true,
        "locale": "zh-hans"
    }
    
    第 4 条附言  ·  2020-05-18 20:38:48 +08:00
    用 PHP 也许可以轻松解决: https://www.php.cn/php-weizijiaocheng-378875.html
    17 条回复    2020-05-19 18:31:34 +08:00
    pushback
        1
    pushback  
       2020-05-18 18:49:37 +08:00
    update wh_users set preferences = (select preferences from wh_users where id = 1)
    不过为啥要批量覆盖呢,这玩意都统一了,查指定为 1 的就行了阿
    Mindjet
        2
    Mindjet  
    OP
       2020-05-18 18:56:02 +08:00
    @pushback 这是用户的配置文件,都指定同一个地址,会不会出现问题呢?比如其中一个用户改了之后,别的用户也全都改了,这个是不行的呀。
    Mitt
        3
    Mitt  
       2020-05-18 19:03:12 +08:00
    @Mindjet 你的要求不就是这样?先自己理清楚自己想要啥效果吧
    XanderChen
        4
    XanderChen  
       2020-05-18 19:09:26 +08:00
    你在 wh_user 新增 user 的时候把这个 preference 接写到 wh_user 里面不就行了吗

    我看你的描述,你是先新建了 100 个 user,然后突然想给这 100 个 user 添加一个 preference ?

    还想要这个 preference 有一个统一的内容?

    我总感觉这个操作有点问题。但是你要真想这样的话。

    我觉得最简单的 for 循环加 preference 内容验证可以解决你的问题。
    Mindjet
        5
    Mindjet  
    OP
       2020-05-18 19:37:38 +08:00
    @Mitt 我的需求不是统一地址,而是各自独立修改,这个早就想清楚了,现在补充到原来的位置,为了更明显现在补充到帖子上。
    Mindjet
        6
    Mindjet  
    OP
       2020-05-18 19:40:32 +08:00
    @XanderChen 情况是这样,这些用户是早期的,里面有一个设置,本来是不默认勾选的,但是现在我想将这些早期用户的配置全部更改成勾选,以便核心的用户统一。所以就是一个批量更改的过程,如果是数组,那么很简单一下就会想到用 for,但我这个需求要尽快实现,自己又没有学过任何 SQL 语句,而且这个东西是二进制文件,不是文本,搜了一下也没发现有什么结果,所以就只能来问。
    Juszoe
        7
    Juszoe  
       2020-05-18 19:47:17 +08:00 via Android
    我知道你的意思了,是要将所有用户二进制配置中的某个勾选上吧,你这描述不太准确。
    解决方案的话,因为它是非结构化数据,sql 可能无法实现,建议还是写个程序一个个修改吧
    Mindjet
        8
    Mindjet  
    OP
       2020-05-18 19:52:41 +08:00
    @Juszoe

    看来我的提问方法有很大的问题,回去反思一下,下次不会这样了 -_-||

    ***

    原来是这样,面对这个 SQL 还不能批量解决了,这个真的没想到,关键是这个二进制数据,实际上就是个文本文档,这就很迷惑了。

    「写程序一个一个修改」中的「写程序」指的是什么?

    用 JDBC 等工具写程序吗?
    Mindjet
        9
    Mindjet  
    OP
       2020-05-18 19:56:47 +08:00
    @Juszoe 那个「所谓的」二进制文件 ,所有内容已经都附加在问题后面了,感觉不是「非格式化数据」,就是 json
    Juszoe
        10
    Juszoe  
       2020-05-18 19:57:34 +08:00
    @Mindjet #8 就是单独写个程序,连接数据库一通操作,读取需要修改的配置,程序将配置文件处理过后再将新配置文件 update 进数据库即可,这个需求不复杂,一个 for 循环应该搞定了,每个循环内处理一个用户。
    Juszoe
        11
    Juszoe  
       2020-05-18 20:02:10 +08:00
    如果是 json,SQL 是可以处理的,但是也是 String 方式存储的才可以(如 varchar ),搜索“sql 操作 json”就能看到
    Mindjet
        12
    Mindjet  
    OP
       2020-05-18 20:04:00 +08:00
    只要能连接数据库操作就可以,那这样的话应该是可以用 JDBC(Java Database Connectivity),像这样小的需求用 Java 是否大材小用了呢?

    Python 也许是最佳选择,但没学过,感觉应该没什么难度,脚本语言可能挺简单的吧,花 2 小时还解决不了,考虑用 JDBC 解决。
    Mindjet
        13
    Mindjet  
    OP
       2020-05-18 20:08:05 +08:00
    Windows 版 MySQL 正在安装,准备先从服务器搞下来(用户少非常方便就能弄下来吧),装在本地,用 Python 连接上,编程修改。
    Mindjet
        14
    Mindjet  
    OP
       2020-05-18 20:13:24 +08:00
    @Juszoe 存储方式为「 blob 」,这是我用 Flarum 搭建了一个小论坛,这个就很纳闷了,不知道为什么明明是文本,还要用 blob 存起来,也许是设计失误。
    tomczhen
        15
    tomczhen  
       2020-05-18 20:22:10 +08:00 via Android
    估计是因为早期 MySQL utf8 解决方案里面有这种方式,存二进制可以不用转类型,毕竟还有个 utf8 mb4 。
    Mindjet
        16
    Mindjet  
    OP
       2020-05-18 20:39:18 +08:00
    @tomczhen Thanks♪(・ω・)ノ 原来如此
    Mindjet
        17
    Mindjet  
    OP
       2020-05-19 18:31:34 +08:00
    @Juszoe 已经批量修改完成了,可用 SQL 语句修改,二进制数据表示为十六进制数据。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5068 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 07:40 · PVG 15:40 · LAX 23:40 · JFK 02:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.