1

PremiseIDという主キーを持つデータベーステーブルがあります。

そのMySQL列定義はCHAR(10)です。

列に入力されるデータは常に10桁です。これは、「113091000」のように9桁の数字の後にスペースが続くか、「113091000A」のように9桁の数字の後に文字が続くかのいずれかです。

これらの値の1つをテストMySQLデータベーステーブルt1のテーブルに書き込んでみました。3つの列があります

mainid integer
parentid integer
premiseid char(10)

次の値を持つ行を挿入し、行1,1,'113091000 'を読み戻そうとすると、「113991000」の値が切り捨てられるため、「113091000」と表示されます。つまり、スペースが削除されます。「113091000A」のような番号を挿入すると、その値が保持されます。

CHAR(10)フィールドにスペース文字を保持させるにはどうすればよいですか?

私はこの問題をプログラムで回避する方法があります。len( '113091000')を取得し、それが9文字であることを認識してから、9の長さを実現すると、その数値にスペース接尾辞があると推測されます。

4

4 に答える 4

3

MySQLリファレンスから引用するには:

列の長さはCHAR、テーブルの作成時に宣言した長さに固定されます。長さは0から255までの任意の値にすることができます。CHAR値が格納されるとき、指定された長さまでスペースが右に埋め込まれます。CHAR値が取得されると、末尾のスペースが削除されます。

したがって、それを回避する方法はありません。MySQL 5.0.3以降を使用している場合は、使用するVARCHARのがおそらく最善の方法です(オーバーヘッドは1バイト余分にあります)。

VARCHAR値は、保存時に埋め込まれません。末尾のスペースの処理はバージョンによって異なります。MySQL 5.0.3以降、標準SQLに準拠して、値が格納および取得されるときに末尾のスペースが保持されます。VARCHARMySQL 5.0.3より前では、末尾のスペースは、値が列に格納されるときに値から削除されていました。これは、取得した値にスペースも含まれていないことを意味します。

MySQL <5.0.3を使用している場合は、返された長さを確認するか、スペース以外の文字を使用する必要があると思います。

おそらく最もポータブルな解決策はCHAR、返された長さを使用して確認することです。

于 2012-07-30T19:48:22.247 に答える
2

Q: CHAR(10)フィールドにスペース文字を保持させるにはどうすればよいですか?

実際には、そのスペースは保持および保存されます。スペースを削除しているのは値の取得です。(戻り値の末尾のスペースの削除は、文書化された「機能」です。)

(回避策としての)1つのオプションは、SQLクエリを変更して、戻り値に末尾のスペースを追加することです。

SELECT RPAD(premiseid,10,' ') AS premiseid FROM t1 

これにより、10文字の長さの文字列として値が返され、値が10文字より短い場合はスペースが埋め込まれ、長い場合は10文字に切り捨てられます。

于 2012-07-30T21:20:36.933 に答える
1

標準CHAR(10)の列には、文字列を必要な長さの10文字まで埋めるために、常に末尾にスペースがあります。そのため、意図的に末尾にあるスペースはすべてブレンドされ、通常はデータベースアダプタによって削除されます。

可能であればVARCHAR(10)、末尾のスペースを保持する場合は、列に変換します。ALTER TABLEステートメントでこれを行うことができます。

于 2012-07-30T19:50:43.993 に答える
1

ゴードンの答えはそれ自体で正しいかもしれませんが、解決策について述べたよりも後のバージョンがあります。
コードでSETsql_mode='PAD_CHAR_TO_FULL_LENGTH';を実行します。

このセッション設定を使用すると、CHAR(10)の全長で完全な列を取得できますが、末尾にスペースが事前に入力されていない場合、VARCHARは取得しません。スペースが必要ない場合は、いつでもrtrim()を使用できます。

于 2017-07-29T17:22:04.283 に答える