Django+MySQL查詢不區分大小寫問題


最近發現一個現象是測試環境的 sqlite 是可以區分大小寫的。

就是說

Python

# sqlite 環境
>>> Company.objects.filter(name='Teambition')
<QuerySet [<Company: Teambition>]>


>>> Company.objects.filter(name='teambition')
<QuerySet [<Company: teambition>]>

而到了線上的 MySQL 就不區分大小寫了。

Python

# MySQL 環境
>>> Company.objects.filter(name='teambition')
[<QuerySet [<Company: Teambition>]>, <QuerySet [<Company: teambition>]>]

獲得到兩個實例。 但這樣不是我預想的。

起初我查詢了官方文檔, 得到指引使用__exact方法. 即:

Python

Company.objects.filter(name__exact='teambition')

但是無效!!!

由於測試環境的 sqlite 沒有問題, 所以懷疑在 mysql 的配置上面。 原來是字符集校對規則的問題, utf8_general_ci 不區分大小寫, 可以改成utf8_bin(將字符串中的每一個字符用二進制數據存儲,區分大小寫。) 或者 utf8_general_cs(cs為case sensitive的縮寫,即大小寫敏感).

但是, 由於我程序段沒有操作數據庫的權限, 所以沒有去 alter 已經有的 TABLE。 我找到另外的一種解決方式

通過 DJANGO ORM 的extra, 在匹配語句上面加上BINARY來區分大小寫.

Python

if settings.ENV == 'prod':
    # 線上的 MySQL 數據庫加上 binary
    app = Company.objects.extra(where=['binary name=%s'], params=[options['app'],]).first()
else:
    # Sqlite 不做處理
    app = Company.objects.filter(name=options['app']).first()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM