Ale*_*lex 5 mysql django collation
我在Django模型中有一个字段用于存储唯一(哈希)值。事实证明,即使我明确告诉Django执行区分大小写的搜索,数据库(MySQL / inno)也不会对这种类型(VARCHAR)进行区分大小写的搜索Document.objects.get(hash__exact="abcd123")。所以都返回了“ abcd123”和“ ABcd123”,我不希望这样。
class document(models.Model):
filename = models.CharField(max_length=120)
hash = models.CharField(max_length=33 )
Run Code Online (Sandbox Code Playgroud)
我可以将'hash field'更改为BinaryField,因此在数据库中它变为LONGBLOB,并且确实进行区分大小写的搜索(并且可以工作)。但是,这对我来说似乎不是很有效。有没有更好的方法(在Django中),例如添加'utf8 COLLATE'?或在这种情况下正确的Fieldtype是什么?(是的,我知道我可以改用PostgreSQL。)
正如 @dan-klasson 提到的,默认的非二进制字符串比较默认不区分大小写;注意_ci末尾的latin1_swedish_ci,它代表不区分大小写。正如 Dan 提到的,您可以使用区分大小写的排序规则和字符集创建数据库。
您可能还想知道您始终可以创建单个表,甚至仅设置单个列以使用不同的排序规则(对于相同的结果)。您还可以在创建后更改这些排序规则,例如每个表:
ALTER TABLE documents__document CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)
此外,如果您不想更改数据库/表字符集/排序规则,Django 允许使用原始方法运行自定义查询。因此,您可以通过使用类似以下内容来解决此更改,尽管我自己尚未对此进行测试:
Document.objects.raw("SELECT * FROM documents__document LIKE '%s' COLLATE latin1_bin", ['abcd123'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1731 次 |
| 最近记录: |