我在数据库中有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表是否存在任何潜在问题?
答案 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
。如果您正确说明客户端编码,则转换将在INSERT
和SELECT
期间进行。
(对于你的目的,utf8和utf8mb4都可以使用。)
如果您还有其他问题,请参阅Trouble with utf8 characters; what I see is not what I stored和/或提供SHOW CREATE TABLE
以及某些违规字符的十六进制。