質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

629閲覧

MySQLのテーブル名に、日本語を利用した際の計算方法について

ryorgyo

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2024/01/01 12:08

編集2024/01/02 02:57

本文

こんにちは。MySQLのテーブル名最大長について質問させていただきたいです。

わからないこと

  • MySQL のテーブル名の byte 数計算方法
    • 日本語テキストでテーブル名を入力した際、50 文字までは作成できるが、51 文字以降だとエラーが発生する

前提

  • 文字コードは UTF8mb4
  • MySQL8.0 利用
  • テーブル名には、「あ」を使用
  • OS は Mac、Windows10 ともに確認

試したこと

  • postgres を利用して、日本語テーブル名を入力したところ、接頭辞 21 文字までで切り取られる
    • postgres は テーブル最大長 63 Byte / 日本語 UTF8 3 Byte = 21 という計算が利用されている

最後に

テーブル名に日本語をつけることに対しての意見ではなく、なぜMySQLだと50文字程度格納できるのか、その計算式はどのようになっているのか、を教えていただける方をベストアンサーとさせていただきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2024/01/02 00:48 編集

一応オペレーティングシステムの名前も記しておいていただけますか。ファイルシステムの制限が関係するかもしれないので。
hiroki-o

2024/01/02 03:00

私が確認した環境は、FreeBSD 13.2です。
ikedas

2024/01/02 15:21 編集

@hiroki-o ありがとうございます。ufsでもファイル名の長さの上限は255バイトのようですね。
yambejp

2024/01/04 04:23

> テーブル名に日本語をつけることに対しての意見ではなく 典型的な特殊なことをやって自力で解決できないのであれば、その特殊なこと(=日本語のファイル名をつける)はやめたほうがいいという案件です
guest

回答1

0

ベストアンサー

結論から言うと、ストレージエンジンの仕様による制限だと思われます。オペレーティングシステムの制限も関係すると考えられます。

以下を確認しました。

  • macOS Ventura 13.6.3 (M2)
  • MySQL 8.0.35
  • InnoDB

平仮名65文字:

mysql> create table ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおおおおおああああああああああいいいいい (a int); ERROR 1103 (42000): Incorrect table name 'ああああああああああいいいいいいいいいいううううううううううえええ?'

識別子名の長さ制限 (64文字) に引っ掛かります (エラーメッセージのテーブル名が変なところで切り詰められていますが)。

平仮名64文字 - 51文字

mysql> create table `ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおおおおおああああああああああいいいい` (a int); ERROR 1030 (HY000): Got error 168 - 'Unknown (generic) error from engine' from storage engine ... mysql> create table `ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおおおおおあ` (a int); ERROR 1030 (HY000): Got error 168 - 'Unknown (generic) error from engine' from storage engine

MySQL自身も知らない (なんだそりゃ) ストレージエンジンのエラーで失敗します。

平仮名50文字

mysql> create table `ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおおおおお` (a int); Query OK, 0 rows affected (0.01 sec)

成功します。

平仮名50文字 と 英字

mysql> create table `ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおおおおおaa` (a int); ERROR 1030 (HY000): Got error 168 - 'Unknown (generic) error from engine' from storage engine mysql> create table `ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおおおおおa` (a int); Query OK, 0 rows affected (0.01 sec)

英字1文字の追加までは成功します。

作成されたテーブルファイルは次のようなものです。

% ls /opt/homebrew/var/mysql/test @3042@3042@3042@3042@3042@3042@3042@3042@3042@3042@3044@3044@3044@3044@3044@3044@3044@3044@3044@3044@3046@3046@3046@3046@3046@3046@3046@3046@3046@3046@3048@3048@3048@3048@3048@3048@3048@3048@3048@3048@304a@304a@304a@304a@304a@304a@304a@304a@304a@304a.ibd @3042@3042@3042@3042@3042@3042@3042@3042@3042@3042@3044@3044@3044@3044@3044@3044@3044@3044@3044@3044@3046@3046@3046@3046@3046@3046@3046@3046@3046@3046@3048@3048@3048@3048@3048@3048@3048@3048@3048@3048@304a@304a@304a@304a@304a@304a@304a@304a@304a@304aa.ibd

Mapping of Identifiers to File Names」で説明されているマッピングにより、平仮名は1文字あたり5バイトになります。これに拡張子4バイトが加わります。

255バイトがストレージエンジンにおけるファイル名の長さの上限だと思われます。

[追記] 今回確認したmacOSの環境では、ファイル名の長さの上限はOSレベルで255文字です。ほかのOSでも、ファイル名の長さの上限が255バイトまたは255文字とするものがほとんどです (なお、OSが扱える パス名 の長さは一般にこれよりも長いです)。そのため、255バイトがストレージエンジンにおけるファイル名の長さの事実上の上限となると考えられます。

投稿2024/01/02 01:38

編集2024/01/02 03:11
ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryorgyo

2024/01/10 13:23

評価まで時間がかかり大変申し訳ございません。 ご回答いただきありがとうございます。 ストレージエンジンの255バイトが制限となっていたんですね。 windows、MacOSともに発生した現象でしたので、ストレージエンジン周りをもう少し調査してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問