MySQLのエンコードの不一致によって発生する可能性のある問題

MySQLのエンコードの不一致によって発生する可能性のある問題

ストアドプロシージャとコーディング

MySQL ストアド プロシージャでは、テーブルとデータのエンコーディングがデータベースとストアド プロシージャのデフォルトのエンコーディングと異なる場合、MySQL は条件列のデータに対して対応するエンコーディング変換を実行するため、SQL はインデックスを使用しない場合があります。たとえば、次のテーブル データは latin1 であり、MySQL パーサーは何らかの変換を実行します。

... WHERE namecolumn = NAME_CONST('in_namecolumn',_utf8'MP201022' COLLATE 'utf8_general_ci')

ストアド プロシージャで対応するエンコード変換 (通常は varchar/char フィールドの変更) を実行すると、インデックスを正常に使用できるようになります。詳細については、mysql-slow-when-run-as-stored-proc を参照してください。

... WHERE namecolumn = convert(in_namecolumn using latin1) collat​​e latin1_swedish_ci

SQLを実行するためのJDBC直接接続

jdbc 接続を介して SQL を実行するときに、エンコーディングが一貫していない場合は、次に示すように、varchar および char 型も変換する必要があります。

... WHERE namecolumn = convert(in_namecolumn using latin1) collat​​e latin1_swedish_ci

そうしないと、次のエンコード不整合エラーが発生する可能性があります (mysql-connector のバージョンに応じて動作が異なる場合があります)。

SQL 状態 [HY000]: エラー コード [1267]: 演算 '=' の照合順序 (latin1_swedish_ci、IMPLICIT) と (utf8mb4_general_ci、COERCIBLE) の組み合わせが不正です

jdbc useSSL パラメータの変更

mysql-connector-java 構成では、useSSL パラメータに次の違いがあります。5.1.38 以降、useSSL は MySQL 5.5.45+、5.6.26+、または 5.7.6+ でデフォルトで有効になります。対応する requireSSL および verifyServerCertificate パラメータも有効になります。

< 5.1.38:
 ConnectionProperties.useSSL=サーバーとの通信時にSSLを使用する(true/false)、デフォルトは「false」

>= 5.1.38
 ConnectionProperties.useSSL=サーバーとの通信時にSSLを使用する(true/false)。MySQL 5.5.45+、5.6.26+、または5.7.6+に接続する場合のデフォルトは「true」、それ以外の場合のデフォルトは「false」です。

MySQL 5.7.x 以降では、SSL がデフォルトで有効になり、明示的に暗号化しないように指定しない限り、クライアントは接続時に自動的に暗号化をネゴシエートします。mysql-connector-java は、5.1.38 以降、useSSL をデフォルトで有効にしています。そのため、jdbc の下位バージョンで MySQL 5.7.x に接続する場合は暗号化の問題は発生しませんが、jdbc の上位バージョンで 5.7.6+ に接続する場合は暗号化の問題が発生します。useSSL=false を明示的に指定する必要があります。そうすれば、jdbc の上位バージョンで MySQL 5.5、5.6 に接続する場合は暗号化の問題は発生しません。

これで、一貫性のない MySQL エンコーディングによって発生する可能性のあるいくつかの問題についての記事は終わりです。一貫性のない MySQL エンコーディングによって発生する問題の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • PHP と MySQL における uft-8 の中国語エンコードの文字化けに対するいくつかの解決策
  • MySQL で現在のデータベース エンコーディングを表示および変更する方法
  • MySQLデータベースのテーブルとフィールドのエンコード方法を変更する方法
  • MySqlは文字化けを避けるためにデータベースのエンコードをUTF8に変更します。
  • MySQL で文字エンコーディングを表示および変更する方法
  • MYSQL データベースで UTF-8 中国語エンコードを使用する場合の文字化けの解決方法
  • Mysql データベースのエンコーディングの問題 (データベース、テーブル、フィールドのエンコーディングを UTF8 に変更)
  • MySQL 5.5 のデフォルトのエンコーディングを変更する (グラフィックの手順を UTF-8 エンコーディングに変更する)
  • 中国語(gbk または utf8)をサポートするために、mysql エンコーディングを確認して変更します。
  • MySQLの文字エンコーディング設定方法

<<:  div が iframe に覆われるいくつかの状況とその解決策

>>:  ドメイン名、ポート、異なるIPに基づくnginx仮想ホスト設定の実装

推薦する

MySQL がデフォルト値を持つ NULL 列の使用を推奨しない理由

よく聞かれる答えは、列に NULL 値を使用するとインデックスが無効になるというものですが、実際にテ...

jQuery を使用してカルーセル効果を実装する

この記事では、jQueryでカルーセルチャートを実装するための具体的なコードを参考までに共有します。...

簡潔なReactコンポーネントを書くためのヒント

目次スプレッド演算子を使用してプロパティを渡すのは避けてください関数パラメータをオブジェクトにカプセ...

ネイティブ js はカスタム スクロール バー コンポーネントを実装します

この記事の例では、カスタムスクロールバーコンポーネントを実装するためのjsの具体的なコードを参考まで...

dockerにros2をインストールするための詳細な手順

目次メイントピック1. UbuntuにDockerをインストールする2. DockerにROS2-F...

Reactイベントメカニズムソースコード分析

目次原理ソースコード分析委任されたイベントバインディングすべてのサポートされているイベントを聴くネイ...

WeChat アプレット計算機の例

WeChatアプレット計算機の例、参考までに、具体的な内容は次のとおりです。インデックス.wxml ...

CSS スタイルで一般的なグラフィック効果を示すサンプルコード

一般的な基本グラフィックと私が遭遇するいくつかの小さなアイコンについて簡単に説明します。以下は CS...

Springboot および Vue プロジェクトの Docker デプロイメントの実装手順

目次A. SpringbootプロジェクトのDockerデプロイメント1. Springbootプロ...

html 内の絶対パス URL と相対パス URL、サブディレクトリ、親ディレクトリ、ルート ディレクトリ

絶対 URL は、インターネット上の特定のファイルに必要なすべてのコンテンツを表すために使用されます...

Angularフレームワークのビュー抽象定義の詳細な説明

序文「大規模なフロントエンド プロジェクト向け」に設計されたフロントエンド フレームワークである A...

Linux のタイムドログ削除を実装する簡単な方法

導入Linux は、ファイル、ログ、電子メール、バックアップなどを自動的に生成できるシステムです。ハ...

nginx 設定ファイルで環境変数を使用する方法

序文Nginx はパフォーマンスを重視して設計された HTTP サーバーです。Apache や li...

WeChatアプレットで画像の幅と高さを取得する方法

起源最近、私は要件 A に取り組んでいます。そこには、次のように記述される小さな機能ポイントがありま...