ゼロ幅文字トラップを解決し、データベースに「取り憑かれた」状態を解消する方法を説明する 3 つのヒント。
著者: Qin Fulang 氏。Aikesheng の DBA チームのメンバーで、日々のプロジェクトの問題の処理と会社のプラットフォームの問題のトラブルシューティングを担当しています。インターネットが好きで、写真に詳しく、料理の腕も立つ DBA は、良い運転手ではありません、ディディ〜
Aikeson オープンソース コミュニティによって作成されているため、オリジナルのコンテンツを許可なく使用することはできません。転載する場合は編集者に連絡し、出典を明記してください。
この記事は約 1,000 ワードで、読むのに 3 分かかると予想されます。
導入
MySQL を使用する過程で、小さな文字が大きな問題を引き起こすことがあります。真実を知る前は、問題が幽霊によって引き起こされていると考えていましたが、真実を知ったとき、それが単一の文字によって引き起こされているとは予想していませんでした。問題は、幅ゼロの文字が IT 業界のあらゆる側面に隠れている幽霊のようなものであるということです。今日は、MySQL で繰り返される「テーブルの消失」の事例を紹介します。
問題の説明
test
という名前のテーブルが、何らかの手段 (コマンド ラインやデータベース開発ツールなど) を通じてデータベースに作成されますlang
。テーブル構造は次のとおりです。
CREATE TABLE `lang` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SHOW TABLES;
コマンドにより、このテーブルの存在を確認できます。
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a1 |
| lang |
| t1 |
| z1 |
+----------------+
4 rows in set (0.00 sec)
ただし、MySQL クライアントでクエリまたはビジネス プログラムを実行してSELECT * FROM lang;
テーブルに接続しようとすると、次のエラー メッセージが表示されます。
mysql> select * from lang;
ERROR 1146 (42S02): Table 'test.lang' doesn't exist
時計は魔法のように消えてしまいました。
原因分析
幽霊を見ているようなものです。クエリ構文を何度も手動で入力しても、このテーブルをクエリすることはできません。テーブル作成ステートメントを Sublime Text テキスト ツールにコピーします。
この時点で、テーブル名の後に「<0×200b>」という文字が続いているという問題が見つかりました。これは、ゼロ幅文字の一種であるゼロ幅スペースです。
ゼロ幅文字とは何ですか?
幅ゼロ文字は特別な Unicode 文字であり、表示されるスペースを占有しないため、ほとんどの状況では表示されません。ただし、テキスト内に存在する可能性があり、データベース管理システムなどのコンピューター プログラムに影響を与える可能性があります。 Unicode では、U+200B はゼロ幅スペースを表し、改行が必要な場合によく使用されます。さらに、ここでは説明しませんが、他にもゼロ幅文字があります。
では、なぜこの幽霊のようなキャラクターが存在するのでしょうか?いわゆる存在は合理的であることを意味し、データのクローリング防止、暗号化された情報の送信、機密性の高い単語のスキャンの防止などのシナリオでよく使用されます。しかし、データベース システムで使用すると、問題が発生することがあります。この記事で説明した問題もその 1 つです。これらの文字はスペースを占有しませんが、SQL コマンドの正しい構造を破壊し、その後の使用時にエラーを引き起こす可能性があります。
の解き方?
- 表を作成する前に、表作成文を複数のテキスト編集ツールにコピーし、異常な記号プロンプトがないか確認してください(一般的なテキストツールではゼロ幅文字が表示できない場合があります)。 Sublime Text や Visual Studio Code などのツールやプラグインを試してみると、ゼロ幅文字を思い出させる機能があり、Unicode 文字を表示できるオンライン Web ツールもいくつかあります。ゼロ幅文字を表示できる他のツールをご存知の場合は、コメント領域にメッセージを残して共有してください。
- テーブル作成後、
SHOW CREATE TABLE;
コマンドでテーブル構造を確認し、その出力を上記のテキスト編集ツールにコピーして、異常なシンボルがないか確認してください。 SHOW TABLES;
多くのテストの結果、MySQL クライアントでコマンドを実行すると、幅ゼロのスペースを含むテーブル名の後ろの境界線「|」が他の行と整列していないことがわかりました。これにより、問題のあるテーブルを迅速に発見できますが、特定の文字は表示されません。もちろん、この方法は通常、サードパーティの開発ツールやビジネス プログラムなどには適用されません。
要約する
ゼロ幅文字は、MySQL の使用中に一見解決できない問題を引き起こす可能性がある目に見えない罠です。その性質を理解し、SQL コマンドを再確認し、信頼できないソースからのコピー アンド ペーストを回避し、適切なツールを使用し、ベスト プラクティスに従うことで、データベースがスムーズに動作し、同様の問題が発生しないことを保証できます。
さらに技術的な記事については、https: //opensource.actionsky.com/をご覧ください。
SQLEについて
SQLE は、開発環境から運用環境までの SQL 監査と管理をカバーする包括的な SQL 品質管理プラットフォームです。主流のオープンソース、商用および国内データベースをサポートし、開発、運用および保守のためのプロセス自動化機能を提供し、オンライン効率を向上させ、データ品質を向上させます。
SQL取得
タイプ | 住所 |
---|---|
リポジトリ | https://github.com/actiontech/sqle |
書類 | https://actiontech.github.io/sqle-docs/ |
リリースニュース | https://github.com/actiontech/sqle/releases |
データ監査プラグイン開発ドキュメント | https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse |