Mysql

為什麼在列級別指定排序規則?

  • December 30, 2019

字元集定義如何將行數據保存到文件儲存中。

Row 17: <CHARSET('utf8', 'hello'), 17, CHARSET('latin-1', 'sup')>

但似乎排序規則只影響這些行的排序。

那麼為什麼在定義列時要指定排序規則呢?

相反,我希望您只在定義與排序行有關的事情時才指定排序規則,即索引(因為它們是按排序儲存的)、查詢(因為它們測試相等和不等式)和約束(因為它們是有效的查詢)。

除非 MySQL / MariaDB 做了我不知道的事情(因為我通常專注於 SQL Server):因為編碼(即“字元集”)是單獨處理的,列級排序規則應該只是用於那些操作的預設值您提到(創建索引、查詢等)比較,因此您不需要每次都指定排序規則(如果未提供具體規則,則無法對字元串進行比較或排序)。這不僅會使查詢變得非常複雜,而且幾乎不可能在查詢之間提供一致性,因為沒有在列級別(或至少在數據庫級別)聲明它會讓查詢開發人員記住數據的意圖建模師,這當然不是成功的秘訣;-)。

如果未在列級別指定,則至少需要在數據庫級別甚至實例級別指定排序規則(我相信有 RDBMS 確實在任一級別指定,甚至可能不允許在列指定等級)。

排序規則只需要在某處指定,否則如果不提供排序規則,您甚至無法重建索引(更不用說創建它)。並且,允許在列級別指定排序規則的粒度允許最大的靈活性,因為表內或同一數據庫中的表之間的不同字元串列可以很容易地具有不同的需求/要求。

並且,作為旁注:對於像 SQL Server 這樣的 RDBMS,將編碼與排序規則結合在一個單一的“排序規則”中(並且無法將兩者分開),有必要在列級別指定,因為它表示編碼(至少對於VARCHAR//列;//CHAR總是UTF-16 LE)。TEXT``NVARCHAR``NCHAR``NTEXT

引用自:https://dba.stackexchange.com/questions/256048