サードパーティ製ツールとの既知の非互換性の問題
注記:
サポートされていない機能セクションには、次のものを含む TiDB でサポートされていない機能がリストされています。
- ストアドプロシージャと関数
- トリガー
- イベント
- ユーザー定義関数
SPATIAL
関数、データ型、インデックスXA
構文上記のサポートされていない機能は想定される動作であり、このドキュメントには記載されていません。詳細については、 MySQLの互換性参照してください。
このドキュメントに記載されている非互換性の問題は、いくつかのTiDBでサポートされているサードパーティツールに見られます。
一般的な非互換性
SELECT CONNECTION_ID()
TiDB で 64 ビット整数を返します。
説明
SELECT CONNECTION_ID()
関数は、TiDB では2199023260887
などの 64 ビット整数を返しますが、MySQL では391650
などの 32 ビット整数を返します。
回避方法
TiDBアプリケーションでは、データオーバーフローを回避するために、 SELECT CONNECTION_ID()
の結果を格納する際に64ビット整数型または文字列型を使用する必要があります。例えば、 JavaではLong
またはString
使用し、JavaScriptまたはTypeScriptではstring
使用できます。
TiDBはCom_*
カウンタを維持しません
説明
MySQLは、データベースに対して実行された操作の合計数を追跡するために、 Com_
で始まるサーバーステータス変数という一連の変数を保持しています。例えば、 Com_select
MySQLが最後に起動されてから開始されたSELECT
文の合計数を記録します(文が正常に実行されなかった場合でも記録されます)。TiDBはこれらの変数を保持していません。TiDBとMySQLの違いを確認するには、 SHOW GLOBAL STATUS LIKE 'Com_%'
変数を使用してください。
回避方法
これらの変数は使用しないでください。よくあるシナリオの一つは監視です。TiDB TiDB Cloudは監視性に優れているため、サーバーステータス変数からのクエリは必要ありません。TiDB TiDB Cloud監視サービスの詳細については、 TiDBクラスタを監視するを参照してください。
TiDBはエラーメッセージでTIMESTAMP
とDATETIME
を区別します
説明
TiDBのエラーメッセージはTIMESTAMP
とDATETIME
を区別しますが、MySQLでは区別せず、すべてDATETIME
として返します。つまり、MySQLはTIMESTAMP
タイプのエラーメッセージを誤ってDATETIME
タイプに変換してしまうのです。
回避方法
文字列の照合にはエラーメッセージを使用しないでください。代わりに、トラブルシューティングにはエラーコード使用してください。
TiDBはCHECK TABLE
文をサポートしていません
説明
CHECK TABLE
ステートメントは TiDB ではサポートされていません。
回避方法
データと対応するインデックスの一貫性をチェックするには、TiDB のADMIN CHECK [TABLE|INDEX]
ステートメントを使用できます。
MySQL JDBCとの互換性
テストバージョンは MySQL Connector/J 8.0.29 です。
デフォルトの照合順序が一貫していない
説明
MySQL Connector/J の照合順序はクライアント側に保存され、サーバーバージョンによって区別されます。
次の表は、文字セットにおけるクライアント側とサーバー側の既知の照合順序の不一致を示しています。
キャラクター | クライアント側のデフォルトの照合順序 | サーバー側のデフォルトの照合順序 |
---|---|---|
ascii | ascii_general_ci | ascii_bin |
latin1 | latin1_swedish_ci | latin1_bin |
utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_bin |
回避方法
照合順序は手動で設定し、クライアント側のデフォルトの照合順序に依存しないでください。クライアント側のデフォルトの照合順序は、MySQL Connector/J 構成ファイルに保存されます。
NO_BACKSLASH_ESCAPES
パラメータは効果がありません
説明
TiDBでは、 \
番目の文字をエスケープせずにNO_BACKSLASH_ESCAPES
パラメータを使用することはできません。詳細については、 問題を参照してください。
回避方法
TiDB ではNO_BACKSLASH_ESCAPES
と\
使用しないでください。SQL ステートメントでは\\
使用してください。
INDEX_USED
関連のパラメータはサポートされていません
説明
TiDBはプロトコルのパラメータSERVER_QUERY_NO_GOOD_INDEX_USED
とSERVER_QUERY_NO_INDEX_USED
設定しません。そのため、以下のパラメータが実際の状況と矛盾した値として返されます。
com.mysql.cj.protocol.ServerSession.noIndexUsed()
com.mysql.cj.protocol.ServerSession.noGoodIndexUsed()
回避方法
TiDB ではnoIndexUsed()
およびnoGoodIndexUsed()
関数を使用しないでください。
enablePacketDebug
パラメータはサポートされていません
説明
TiDBはパラメータパケットデバッグを有効にするサポートしていません。これはMySQL Connector/Jのデバッグ用パラメータであり、データパケットのバッファを保持します。これにより、接続が予期せず切断される可能性があります。このパラメータを有効にしないでください。
回避方法
TiDB でenablePacketDebug
パラメータを設定しないでください。
UpdatableResultSetはサポートされていません
説明
TiDB はUpdatableResultSet
サポートしていません。5 パラメータResultSet.CONCUR_UPDATABLE
指定しないでください。また、 ResultSet
内のデータを更新しないでください。
回避方法
トランザクションによるデータの一貫性を確保するには、 UPDATE
ステートメントを使用してデータを更新できます。
MySQL JDBC のバグ
useLocalTransactionState
とrewriteBatchedStatements
が同時にtrueの場合、トランザクションはコミットまたはロールバックに失敗します。
説明
MySQL Connector/J 8.0.32 以前のバージョンをご利用の場合、パラメータuseLocalTransactionState
とrewriteBatchedStatements
同時にtrue
に設定すると、トランザクションのコミットに失敗する可能性があります。7 にこのコードすると再現します。
回避方法
注記:
useConfigs=maxPerformance
には一連の設定が含まれています。MySQL Connector/J 8.0 および MySQL Connector/J 5.1 の詳細な設定については、それぞれmysql-コネクタ-j 8.0およびmysql-コネクタ-j 5.1参照してください。maxPerformance
使用する場合はuseLocalTransactionState
無効にする必要があります。つまり、useConfigs=maxPerformance&useLocalTransactionState=false
使用してください。
このバグはMySQL Connector/J 8.0.33で修正されました。8.0.xシリーズのアップデートは終了しているため、安定性とパフォーマンスを向上させるためにMySQL Connector/Jを最新の一般提供(GA)バージョンにアップグレードすることを強くお勧めします。
コネクタは 5.7.5 より前のサーバーバージョンとは互換性がありません
説明
MySQL Connector/J 8.0.31 以前のバージョンを、MySQL サーバー 5.7.5 未満、またはMySQL サーバー 5.7.5 未満のプロトコルを使用するデータベース(TiDB v6.3.0 未満など)で使用すると、特定の条件下でデータベース接続がハングすることがあります。詳細については、 バグレポート参照してください。
回避方法
このバグはMySQL Connector/J 8.0.32で修正されました。8.0.xシリーズのアップデートは終了しているため、安定性とパフォーマンスを向上させるためにMySQL Connector/Jを最新の一般提供(GA)バージョンにアップグレードすることを強くお勧めします。
TiDB では、次の方法でもこれを修正します。
- クライアント側: このバグはpingcap/mysql-connector-jで修正されており、公式の MySQL Connector/J の代わりにpingcap/mysql-connector-j使用できます。
- サーバー側: この互換性の問題は TiDB v6.3.0 以降で修正されており、サーバーをv6.3.0 以降のバージョンにアップグレードできます。
Sequelizeとの互換性
このセクションで説明する互換性情報はシークエライズ v6.32.1に基づいています。
テスト結果によると、TiDBはSequelizeのほとんどの機能をサポートしています( MySQL
方言として使用する )。
サポートされていない機能は次のとおりです。
GEOMETRY
はサポートされていません。- 整数主キーの変更はサポートされていません。
PROCEDURE
はサポートされていません。READ-UNCOMMITTED
とSERIALIZABLE
分離レベルサポートされていません。- デフォルトでは、列の
AUTO_INCREMENT
属性の変更は許可されません。 FULLTEXT
、HASH
、SPATIAL
インデックスはサポートされていません。sequelize.queryInterface.showIndex(Model.tableName);
はサポートされていません。sequelize.options.databaseVersion
はサポートされていません。queryInterface.addColumn
使用した外部キー参照の追加はサポートされていません。
整数主キーの変更はサポートされていません
説明
整数型の主キーの変更はサポートされていません。TiDBは、主キーが整数型の場合、データ編成のインデックスとして主キーを使用します。詳細は問題番号 #18090とクラスター化インデックス参照してください。
READ-UNCOMMITTED
およびSERIALIZABLE
分離レベルはサポートされていません
説明
TiDBは分離レベルREAD-UNCOMMITTED
とSERIALIZABLE
サポートしていません。分離レベルがREAD-UNCOMMITTED
またはSERIALIZABLE
に設定されている場合、TiDBはエラーをスローします。
回避方法
TiDB がサポートする分離レベルREPEATABLE-READ
またはREAD-COMMITTED
を使用します。
分離レベルSERIALIZABLE
を設定しているがSERIALIZABLE
に依存しない他のアプリケーションと TiDB の互換性を確保したい場合は、 tidb_skip_isolation_level_check
を1
に設定できます。この場合、TiDB はサポートされていない分離レベルエラーを無視します。
列のAUTO_INCREMENT
属性の変更はデフォルトでは許可されていません
説明
デフォルトでは、 ALTER TABLE MODIFY
またはALTER TABLE CHANGE
コマンドを使用して列のAUTO_INCREMENT
の属性を追加または削除することはできません。
回避方法
AUTO_INCREMENT
の制限を参照してください。
AUTO_INCREMENT
属性の削除を許可するには、 @@tidb_allow_remove_auto_inc
をtrue
に設定します。
FULLTEXT
、 HASH
、 SPATIAL
インデックスはサポートされていません
説明
FULLTEXT
、 HASH
、 SPATIAL
インデックスはサポートされていません。
ヘルプが必要ですか?
不和またはスラック 、あるいはサポートチケットを送信するについてコミュニティに質問してください。