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
l4ever 2021-05-17 13:21:40 +08:00
xxx.encode('latin1').decode('gb2312')
|
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 内置函数转码才能正确显示。
|