
1 zoharSoul 2021-05-17 12:13:03 +08:00 数据导出来, 重新建库, 重刷一遍 |
2 ch2 2021-05-17 12:18:18 +08:00 用 python 写个脚本,重新转一下字符集 ```python # -*- coding: utf-8 -*- from __future__ import print_function import pymysql db_host="127.0.0.1" user="root" password='123456' db="db" mysql_cOnnection=pymysql.connect(host=db_host, user=user, password=password, db=db,charset='utf8mb4') number=100000 def convert(): cursor = pymysql.cursors.SSCursor(mysql_connection) cursor.execute("select * from table") count = 0 total = [] while True: row = cursor.fetchone() if not row: break item = { "content": row[0].decode("gbk").encode("utf-8") } total.append(item) if len(total) >= number: hotcomment_collection.insert_many(total) total = [] count += number print(count) if len(total) > 0: #插入新的表 def main(): convert() if __name__ == '__main__': main() ``` |
4 dujiangbo OP @ch2 有其他不转码的方案吗? 有一个简陋的客户端用的是 GBK 编码,查询、插入中文均正常。 现在的思路是修改 heidisql 等客户端使用 gbk 编码显示,可是我找不到设置,难道没有这个功能?或者没有 GUI,需要动客户端的配置文件? |
5 no1xsyzy 2021-05-17 13:18:09 +08:00 不能全场转码就变成所有地方动态转码 顺便,这是匈牙利命名法的正确使用范畴之一 gbkUserName = gbkFromU8(u8UserName) 你可以看到,gbk 和 gbk 位置对应,u8 和 U8 位置对应,后期 Review 很方便。 |
6 luckyc 2021-05-17 13:21:40 +08:00 xxx.encode('latin1').decode('') |
9 ragnaroks 2021-05-17 16:05:26 +08:00 建了个测试库,用 heidisql 链接后,将 session charset 改为 latin1 后中文正常显示 链接字符串应该可以指定会话编码的,jdbc:// 和 ODBC 都可以 |
10 qwerthhusn 2021-05-17 16:57:17 +08:00 等一张图 |
11 dujiangbo OP @ragnaroks 设置 set names ‘latin1’后,查询乱码,把 results 和 client 设置为 utf8 后乱码,设置为 gbk 时乱码。 推测:heidisql 前段显示为 utf8 编码。 疑问:我记得 latin1 会原封不动的存储数据,不进行转码操作,这点在另一个以 gbk 显示的客户端测试通过,names 设置为 latin1,正确显示汉字。不明白如果把 results 设置为 utf8 后,mysql 会如何处理 latin1 转 utf8 ? latin1 存储的实际是 gbk 编码的数据,期望转码应该是 gbk 转 utf8,但不知道 mysql 怎么把 latin1 转成 utf8 ?谢谢。 |
12 dujiangbo OP 按照错进错出的原则,mysql 客户端只能用 GBK 编码显示,然后 set names “latin1”才能正确显示,否则涉及汉字的字段只能用 mysql 内置函数转码才能正确显示。 |