Mariadb

為什麼我的數據庫名稱被截斷?

  • January 20, 2022

我正在使用 MariaDB v5.x 並希望在查詢中返回一個長數據庫名稱。我可以通過一個簡單的查詢成功地做到這一點,但是通過更複雜的查詢,數據庫名稱會被截斷

$$ 34 characters $$. 為什麼會發生這種情況,有沒有辦法檢索完整的、未截斷的名稱? 此範例查詢有效:

SELECT DATABASE() as 'database', hour as 'hour'
FROM time
WHERE hour = 1;

但是,這種類型的查詢返回截斷的數據庫名稱:

SELECT DATABASE() as 'database',
      t.hour as 'hour',
      d.day as 'day'
FROM   time t,
      day d
WHERE  t.day_pk = day.pk AND
      t.hour   = 1      AND
      d.day    = 22
UNION ALL
SELECT DATABASE() as 'database',
      t.hour as 'hour',
      d.day as 'day'
FROM   time t,
      day d
WHERE  t.day_pk = day.pk AND
      t.hour   = 1      AND
      d.day    = 24;

感謝您的任何/所有幫助。

D.

我可以確認即使在 MariaDB 10.7.1 中也存在相同的行為。

截斷似乎在UNION使用時發生。

這是一種解決方法 - 使用該substring函式來指示您想要全長:

SELECT substring(database() FROM 1 FOR length(database())) AS "database"
UNION ALL
SELECT substring(database() FROM 1 FOR length(database()));

確認@dbdemon 發布的內容是所有版本中都存在的錯誤。使用--column-type-info顯示了更多關於正在發生的事情的洞察力。

$ db=$(printf 'a%.0s' {1..40})
$ echo $db
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
$ podman run -d --rm -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -e MYSQL_DATABASE=$db -e MYSQL_USER=u -e MYSQL_PASSWORD=p --name m55 mariadb:5.5
1b2c0740bf664b8a3da8071bb96234a86fe8dd5f3eb6348598f5d0c2b59ede56

$ podman exec -ti m55 mysql -u u -pp  --column-type-info -e 'select database() as "database" union all select database()' $db
Field   1:  `database`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       VAR_STRING
Collation:  latin1_swedish_ci (8)
Length:     34
Max_length: 34
Decimals:   0
Flags:      


+------------------------------------+
| database                           |
+------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+------------------------------------+

$ podman exec -ti m55 mysql -u u -pp  --column-type-info -e 'select database()' $db
Field   1:  `database()`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       VAR_STRING
Collation:  latin1_swedish_ci (8)
Length:     34
Max_length: 40
Decimals:   31
Flags:      


+------------------------------------------+
| database()                               |
+------------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+------------------------------------------+

從程式碼中我們可以看到 34 來自MAX_FIELD_NAME而不是來自系統表中各種定義的64 NAME_CHAR_LEN 。Db

這些類型的錯誤很容易修復。請報告它們(無論是否容易)。

更新:已創建錯誤 MDEV-27544

更新:已在 10.2.42+、10.3.33+、10.4.23+、10.5.14+、10.6.6+、10.7.2+ 和 10.8.0+ 中修復

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