サードパーティツールとの既知の非互換性の問題
注記:
サポートされていない機能セクションには、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 はこれらの変数を維持しません。ステートメントSHOW GLOBAL STATUS LIKE 'Com_%'
を使用して、TiDB と MySQL の違いを確認できます。
回避方法
これらの変数は使用しないでください。一般的なシナリオの 1 つは監視です。TiDB は十分に監視可能であり、サーバーステータス変数からのクエリを必要としません。カスタム監視ツールについては、 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
に設定すると、トランザクションのコミットに失敗する可能性があります。 このコードで再現できます。
回避方法
注記:
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 プロトコルを使用するデータベース (v6.3.0 より前の TiDB など) で使用すると、特定の条件下でデータベース接続がハングすることがあります。詳細については、 バグレポート参照してください。
回避方法
このバグは MySQL Connector/J 8.0.32 で修正されました。8.0.x シリーズの更新が停止していることを考慮すると、安定性とパフォーマンスを向上させるために、MySQL Connector/J を最新の一般提供(GA)バージョンにアップグレードすることを強くお勧めします。
TiDB では、次の方法でもこれを修正します。
- クライアント側: このバグはpingcap/mysql-connector-jで修正されており、公式の MySQL Connector/J の代わりにpingcap/mysql-コネクタ-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
はサポートされていません。
助けが必要?
TiDB コミュニティ 、またはサポートチケットを作成するについて質問します。