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

czq61nw1  于 2023-02-15  发布在  Mysql
关注(0)|答案(3)|浏览(204)

我在一个数据库中有10个表。其中9个表只存储Latin-1支持的标准ASCII 1字节字符。其中1个表要求我存储只受UTF8支持的特殊字符。我希望使用相同的MySQL连接对象(使用Python的PyMySQL库)来填充所有10个表。
以前,在创建MySQL连接对象时,我没有指定字符集,它默认为Latin-1。当我只填充9个Latin-1表时,这是很好的。现在我填充UTF8表,我通过将参数charset ='utf8 mb 4'传递给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表时是否会出现问题。在我的第一轮测试之后,一切看起来都很好。
有没有我忽略了什么?在Latin-1表中插入UTF8编码的字符有没有潜在的问题?

dm7nw8vv

dm7nw8vv1#

这是可以做到的。但是...你必须正确地设置一些东西,否则你会得到几种形式的垃圾中的任何一种。
如果客户端中的字节是UTF-8编码的,那么你必须告诉MySQL这个事实,这通常是在连接字符串上完成的,你的charset='utf8mb4'连接参数就是这样做的,下面是一些Python特有的技巧:http://mysql.rjweb.org/doc.php/charcoll#python
同时,表中的列可以是latin 1或utf8(因为您确信数据仅限于它们之间的通用字符)。
字符示例:é在latin 1中是十六进制E9,在MySQL的utf8(或utf8 mb 4)中是C3A9。如果您正确指定了客户端编码,则转换将在INSERTSELECT期间发生。
(For* 您的 * 目的,utf8和utf8 mb 4都可以。)
如果您还有其他问题,请参阅Trouble with utf8 characters; what I see is not what I stored和/或提供一些违规字符的SHOW CREATE TABLE和hex。

f87krz0w

f87krz0w2#

你好,utf8和latin 1都是简单编码,它们支持一些字符,但两者都不包括,所以可能会出现问题。如果你传递一些utf8的数据,而不是latin 1。在这个过程中,会出现双重编码。
Here是将utf8插入到拉丁文的链接

piok6c0g

piok6c0g3#

我遇到了同样的问题,并通过使用Convert和Cast函数解决了它:

mycursor.execute("INSERT INTO `topics` (`title`,parent_id)
 VALUES (convert(cast(convert( %s using utf8) as binary) using latin1),0)" ,(name,) )

相关问题