Python解码为阿拉伯语

问题描述

我正在使用 Apache Airflow,这是我的 Pythonoperator 中用于收集数据的函数。 我的数据有阿拉伯字符串。现在,当我执行查询而不将字符设置为 utf8 时,我得到“???? ???”。所以我在下面做了这个设置。但问题仍未解决,我得到了最后 "ÙØÙداÙÙاجرÙ"

在阿拉伯语中应该是“محمد الهاجرى”

query = "select * from test_sample limit 1;"
source_hook = MysqLHook(MysqL_conn_id='MysqL_conn',schema='MysqL')
source_conn = source_hook.get_conn()
source_cursor = source_conn.cursor()
source_cursor.execute("SET NAMES utf8;") 
source_cursor.execute("SET CHaraCTER SET utf8;") 
source_cursor.execute("SET character_set_connection=utf8;")
source_cursor.execute(query)    
columns = [col[0] for col in source_cursor.description]
records_data = [dict(zip(columns,row)) for row in source_cursor.fetchall()]
record = records_data[0]
test_a = record['name']
print(test_a)

您可以查看此链接 here ,当您粘贴 ÙØ­Ùد اÙÙاجر٠时,您可以看到 محمد الهاجرى 上方的阿拉伯语输出。但我无法在我的代码中得到它。有什么想法吗?

我创建的表格如下:

CREATE TABLE IF NOT EXISTS `test_sample` (
  `ID` int(10) NOT NULL,`name` varchar(255)  DEFAULT NULL,PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

解决方法

感谢 Rick 和大家的回复!

我将在这里发布我如何解决我的问题:

在深入研究实际上没有必要的问题之后,因为答案一直在我面前,哈哈。 由于我使用的是 Apache Airflow,而我错过添加的连接配置在 extra {"charset":"utf8"} 中。并解决了它!这是参考 (https://airflow.apache.org/docs/apache-airflow-providers-mysql/stable/connections/mysql.html)

此外,我的 mysql.cnf 配置已设置-不确定它是否会有所作为-为:

[client]
default-character-set = utf8mb4
[mysqld]
skip-character-set-client-handshake
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init-connect = SET NAMES utf8mb4
[mysql]
default-character-set = utf8mb4

也适用于表:

CREATE TABLE IF NOT EXISTS `test_sample` (
  `ID` int(10) NOT NULL,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

我删除了 MySqlHook 连接代码中的所有 - 不再需要 - :

source_cursor.execute("SET NAMES utf8;") 
source_cursor.execute("SET CHARACTER SET utf8;") 
source_cursor.execute("SET character_set_connection=utf8;")

希望它也能帮助其他人,干杯!