mysql 5.5 utf-8 排序规则 utf8_unicode_ci, pymysql

Posted

技术标签:

【中文标题】mysql 5.5 utf-8 排序规则 utf8_unicode_ci, pymysql【英文标题】:mysql 5.5 utf-8 collation utf8_unicode_ci, pymysql 【发布时间】:2012-09-14 20:48:04 【问题描述】:

我在 os x 上遇到了 mysql 5.5 的问题。我正在做一个多语言项目 并使用 MyISAM 表。默认字符集是 utf-8,默认排序规则是 utf8_unicode_ci。

意大利语和德语都可以,但西班牙语不行。我正在使用 python 来操作数据, pymysql 驱动程序,字符集选项为 utf-8 和 unicode true。

几乎所有特定的西班牙字母都是一团糟。

来自 python 外壳:

>>>r
>>>['Blas P\xc3\xa9rez Gonz\xc3\xa1lez, 4']
>>>print[0]
>>>Blas Pérez González, 4
after saving it to database and fetching it again:
>>>r
>>>(u'Blas P\xc3\xa9rez Gonz\xc3\xa1lez, 4')
>>>print r[0]
>>>Blas Pérez González, 4

我真的一头雾水,明明好像是同一个unicode字符串!

谢谢。

【问题讨论】:

为什么第一个字符串前面没有'u'(作为第二个?) 感谢您的回答,但更详细的解释将帮助我理解 :) 【参考方案1】:

最好使用 java 风格的 unicode 转义,比如

u'\\u0e4f\\u032f\\u0361\\u0e4f'.decode('unicode-escape')

见similar question。

这样可以确保字符串中包含 unicode。

然后实际问题:在mysql中试试describe the_table。还是在column definition可以设置字符集。试试看你的桌子是否还好。


用于测试:u'Blas P\\u00e9rez Gonz\\u00e1lez'.decode('unicode-escape') 存储在数据库中。 然后你就知道存储了正确的 unicode 字符串。 如果数据库有正确的 db/table/field 定义,可能只有检索而不是存储有问题。

【讨论】:

请多解释一下。在我能够首先解码当前格式之前,我无法以任何其他格式对字符串进行编码。 好吧,非常感谢,这似乎是问题,至少将字符串保存为 java 风格的 unicode 并再次检索它会以正确的方式显示:u'Blas P\xe9rez Gonz\ xe1lez',不使用 java 样式是 u'Blas P\xc3\xa9rez Gonz\xc3\xa1lez, 4'。我现在的问题是如何从数据库中检索所有错误的记录,将其转换为 java 样式并再次保存。我在谷歌上搜索了一段时间,不幸的是没有成功 让我感到困惑的是: print 'Blas P\xc3\xa9rez Gonz\xc3\xa1lez, 4' 它将正确显示,但 print u'Blas P\xc3\xa9rez Gonz\xc3\xa1lez, 4' 不是,如果 type unicode(u'Blas Pérez gonzález').encode('utf-8') return 'Blas P\xc3\xa9rez Gonz\xc3\xa1lez' 我想它没有正确编码,为什么?跨度> 编辑/显示的字符 (é) 取决于编辑器/查看器/平台的编码。不幸的是,我目前只有一个 UTF-8 系统,没有 Python 编码经验。见u.encode。

以上是关于mysql 5.5 utf-8 排序规则 utf8_unicode_ci, pymysql的主要内容,如果未能解决你的问题,请参考以下文章

Mysql中的UTF-8字符集与字符集排序规则的选择

如何将整个 MySQL 数据库字符集和排序规则转换为 UTF-8?

UTF-8 MySQL 和字符集

PostgreSQL UTF-8 二进制排序规则

linux下mysql UTF-8编码修改

如何在 SQL Server 数据库中使用 UTF-8 排序规则?