如何在 MySQL 中处理非拉丁字符(即 С крыш наших домов)?

Posted

技术标签:

【中文标题】如何在 MySQL 中处理非拉丁字符(即 С крыш наших домов)?【英文标题】:How do I handle non-latin characters (i.e. С крыш наших домов) in MySQL? 【发布时间】:2021-12-28 21:19:58 【问题描述】:

我正在使用mysql-connector-python 库连接并写入 MySQL 5.7 db。我已将编码设置为utf8mb4cursor.execute('SET CHARACTERS SET utf8mb4'),甚至将其包含在我的连接设置中:

import mysql.connector
from mysql.connector import Error

sg_titles_db_settings = 
    'user': <user>,
    'password': <password>,
    'host': <host>,
    'port': <port>,
    'database': <db>,
    'charset': 'utf8'


def get_mysql_connection():
    try:
        db_connection = mysql.connector.connect(**sg_titles_db_settings)
        return db_connection
    except Error as e:
        print("Error: ", e)
        return False

但任何非拉丁文(非英文字母),例如任何东欧字母字符或特殊符号(例如),都会插入为?

如果我不更改编码,以下是我收到的错误:

1366 (HY000): Incorrect string value: '\xD0\x9E\xD1\x82\xD0\xB2...' for column...

我不明白我需要做什么才能解决此问题。我偶然发现的每篇文章似乎都没有帮助。

提前致谢!

【问题讨论】:

表也必须有utf8字符集或列 【参考方案1】:

奇怪的是它不适合你。我有一个西里尔文为我工作的项目,我大致有这样的东西:

import MySQLdb
db = MySQLdb.connect(host='', user='', passwd='', db='', use_unicode=True)
cur = db.cursor()

cur.execute('SET NAMES utf8mb4')
cur.execute("SET CHARACTER SET utf8mb4")
cur.execute("SET character_set_connection=utf8mb4")

# Actual database stuff goes here

db.commit()

cur.close()
db.close()

我注意到您使用的模块与我通常使用的模块不同。你有没有尝试过其他的mysql模块,比如MySQLdb?

【讨论】:

也许我会尝试不同的模块【参考方案2】:

在 MySQL 服务器中运行此命令 SET character_set_results=utf8;,应该可以修复它。但是,关闭服务器可能不会保留该更改。

我正在使用 docker,但它不会持续存在。保持编码更改的唯一方法是将其包含在docker-compose.yml 文件中:

services:
    <db name>:
        environment:
            LANG: C.UTF-8

【讨论】:

以上是关于如何在 MySQL 中处理非拉丁字符(即 С крыш наших домов)?的主要内容,如果未能解决你的问题,请参考以下文章

sh закрыть/открытьдоступкпортуmysql

c_cpp Раскраскавконсоли

php Синтаксисразрывастрокиphp

csharp Кодпроверкиисменыпрокси

html Инструкция:наст​​ройкасчетчикаЯндекс.МетрикичерезGoogle标记管理器

text СписокрегионовРоссиипоКЛАДР