如果我知道只使用Latin-1字符,我可以将UTF8编码的字符插入Latin-1表吗?

时间:2016-11-09 15:45:49

标签: python mysql utf-8

我在数据库中有10个表。其中9个仅使用Latin-1支持的标准ascii 1字节字符存储数据。其中1个要求我存储仅由UTF8支持的特殊字符。我想使用相同的MySQL连接对象(使用Python' PyMySQL库)来填充所有10个表。

以前,在创建MySQL连接对象时,我没有指定字符集,它默认为Latin-1。当我只填充9个Latin-1表时,这很好。现在我正在填充UTF8表,我通过传入参数charset =' utf8mb4'来修改连接对象。到PyMySQL连接对象函数:

# Connect to the database
connection = pymysql.connect(host='localhost',
                             user='user',
                             password='passwd',
                             db='db',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

现在我有信心,当插入我的UTF8 MySQL表时,我的所有数据都存储得很好。但是,我不确定在使用我的UTF8连接对象并插入Latin-1表时是否会出现问题。在我的第一轮测试之后,一切看起来都很棒。

有什么我忽略的吗?将UTF8编码字符插入Latin-1表是否存在任何潜在问题?

2 个答案:

答案 0 :(得分:2)

嗨utf8和拉丁语1都是简单的编码,它们支持一些不包含在内的字符,因此可能会出现问题。如果你传递了一些不在拉丁语中的utf8的数据1.在这个过程中,双重编码会出现问题 Here是将utf8插入拉丁语

的链接

答案 1 :(得分:1)

可以做到。但是......你必须正确设置一些东西,否则你会得到几种形式的垃圾。

如果客户端中的字节是UTF-8编码的,那么你必须告诉MySQL这个事实。这通常在连接字符串上完成。您的charset='utf8mb4'连接参数就是这样做的。以下是一些特定于Python的提示:http://mysql.rjweb.org/doc.php/charcoll#python

同时,表格中的列可以是latin1或utf8(因为您确定数据仅限于它们之间常见的字符)。

一个字符示例:é在latin1中为十六进制E9,在MySQL的utf8(或utf8mb4)中为C3A9。如果您正确说明客户端编码,则转换将在INSERTSELECT期间进行。

(对于你的目的,utf8和utf8mb4都可以使用。)

如果您还有其他问题,请参阅Trouble with utf8 characters; what I see is not what I stored和/或提供SHOW CREATE TABLE以及某些违规字符的十六进制。