- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
出于某些目的,我不得不将数据库中的字段排序规则从 utf8_unicode_ci
更改为 utf8_bin
。事实证明,这种变化导致了 python 数据类型的变化。
问题是如何强制 mysql-python 将 unicode 对象返回给 python。
这是一个显示问题的示例(显式字符集强制使用 use_unicode=1):
>>> con = MySQLdb.connect(..., charset='utf8')
>>> c = c.cursor()
>>> c.execute('SELECT %s COLLATE utf8_bin', u'м')
1L
>>> c.fetchone()
('\xd0\xbc',)
>>> c.description
(("'\xd0\xbc' COLLATE utf8_bin", 253, 2, 3, 3, 31, 0),)
>>> c.execute('SELECT %s COLLATE utf8_unicode_ci', u'м')
1L
>>> c.fetchone()
(u'\u043c',)
>>> c.description
(("'\xd0\xbc' COLLATE utf8_unicode_ci", 253, 2, 3, 3, 31, 0),)
在我的数据库中,字段是 VARCHAR 类型,但更改后它们的行为类似于 BINARY,这不是我想要的。
最佳答案
事实证明,这个问题比较尴尬。简而言之,MySQL string datatypes 中的大多数变种和物种使用附加的 BINARY 标志映射到 MySQL 接口(interface)中的单一数据类型。
因此,MySQL 的 VARCHAR
、VARBINARY
和字符串文字映射到列类型中相同的 MySQLdb.constants.FIELD_TYPE.VAR_STRING
类型定义,但是当类型为 VARBINARY
或使用 *_bin
排序规则排序的字符串时,有一个额外的 MySQLdb.constants.FLAG.BINARY
标志。
尽管有一个 MySQLdb.constants.FIELD_TYPE.VARCHAR
类型,但我没找到它是什么时候使用的。正如我所说,MySQL VARCHAR
列映射到 FIELD_TYPE.VAR_STRING
。
如果您的应用程序使用真正的二进制字符串(例如,您存储图像并使用与文本相同的连接来获取它们),解决方案将变得相当脆弱,因为它假定将所有二进制字符串解码为 unicode。虽然,它有效。
作为官方docs状态:
Because MySQL returns all data as strings and expects you to convert it yourself. This would be a real pain in the ass, but in fact, _mysql can do this for you. (And MySQLdb does do this for you.) To have automatic type conversion done, you need to create a type converter dictionary, and pass this to connect() as the conv keyword parameter.
在实践中,真正痛苦的可能是构建您自己的转换器字典的过程。但是您可以从 MySQLdb.converters.conversions
导入默认值并对其进行修补,甚至可以在 Connection 的实例上对其进行修补。诀窍是为 FLAG.BINARY
标志删除一个特殊的转换器,并为所有情况添加一个解码器。如果您为 MySQLdb.connect
显式指定 charset
参数,它会强制使用 use_unicode=1
参数,这会为您添加解码器,但您可以自己做:
>>> con = MySQLdb.connect(**params)
>>> con.converter[FIELD_TYPE.VAR_STRING]
[(128, <type 'str'>), (None, <function string_decoder at 0x01FFA130>)]
>>> con.converter[FIELD_TYPE.VAR_STRING] = [(None, con.string_decoder)]
>>> c = con.cursor()
>>> c.execute("SELECT %s COLLATE utf8_bin", u'м')
1L
>>> c.fetchone()
(u'\u043c',)
如果需要,您可能需要对 FIELD_TYPE.STRING
进行相同的修改。
另一种解决方案是将显式 use_unicode=0
传递给 MySQLdb.connect
并在您的代码中进行所有解码,但我不会这样做。
希望,这可能对某人有用。
关于python - mysql-python 整理问题 : how to force unicode datatype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522413/
这个问题已经有答案了: EmailAddress or DataType.Email attribute (3 个回答) 已关闭 3 年前。 我使用了像[EmailAddress]这样的数据属性和[D
我收到此错误: "CS0104: 'DataType' is an ambiguous reference between 'System.ComponentModel.DataAnnotations
1)我目前正在尝试理解以下代码,但我无法理解 void(*func)(void) 的含义,我可以理解我正在尝试保存名为“function”的函数的地址来自 list0513,在 void 指针函数处,
我们可以以某种方式应用这种格式吗? [Display(Name = "Date of Birthday")] [DataType(DataType.Date)] public DateTime DOB
我已按照 ORMLite 文档的规定将我的类型声明为 SERIALIZABLE,但我仍然得到: ORMLite can't store unknown class interface java.io.
嗨。 这就是我想要做的: str2 = "91"; str1 = "19"; var testQuery = from c1 in str1
我在 MVC 5 中使用 ASP.NET 身份。对于密码验证,我在 AccountViewModels.cs 中有以下代码: [Required] [DataType(DataType.Passwor
我试图了解使用之间的主要区别是什么[DataType(DataType.EmailAddress)] & [EmailAddress] . 在模型类中:- public class MYViewMod
使用 DataType Attribute 有什么区别?并传入值 DataType.Phone和 Phone Attribute它继承自 DataType 并自动设置 DataType.Phone?
我的 ViewModel 中有以下字段: [DataType(DataType.Date)] [Display(Name = "Preferred date)")] publi
如果没记错的话,是[DataType(DataType.Currency)]的DataAnnotation的对应部分在 Fluent api 中是 modelBuilder.Entity.Proper
给定一个 pandas.DataFrame带有包含混合数据类型的列,例如 df = pd.DataFrame({'mixed': [pd.Timestamp('2020-10-04'), 999, '
我在电子邮件字段上使用此代码: [Required] [DataType(DataType.EmailAddress)] [Display(Name = "Email addr
我是 NodeJs 开发的新手 我正在使用带有 mysql 和 Sequelize 的 NodeJs 来创建具有这些属性的 Batch 模型。 const Batch = sequelize.defi
我想动态生成我的数据框架构我有以下内容 错误: assert isinstance(dataType, DataType), "dataType should be DataType" Asse
我是 Golang 的新手。抱歉,我仍然对以下两者之间的区别感到困惑: type 和 type = 这是一个例子: package main import "fmt" func main()
当电子邮件地址以数字开头时,DataType DataAnnotation 中 DataType.Email 的内部验证似乎失败了。当具有 1234Something@gmail.com 样式电子邮件
有需求从CSV文件中提取数据,然后将其转换为XML,最终加载到目标中。 CSV文件中的数据为 Number,Email,Email Communication,Member Type,VIN 8532
我正在使用 [DataType(DataType.Date)]关于我们模型中的属性。 如何让 Razor 添加 css 类 datepicker到所有属于 DataType.Date 的文本框特性?
我的表 CalTime 有一个时间数据类型的列 Timespent。它以 HH:MM:SS 格式存储值。请建议如何求和该列的值。 Timespent _______ 00:07:
我是一名优秀的程序员,十分优秀!