2

私はchar_length()を使用して「Русский」のサイズを測定しています。奇妙なことに、7文字であると表示される代わりに、14文字であると表示されます。興味深いことに、クエリが単純な場合は...

SELECT CHAR_LENGTH('Русский')

...答えは正しいです。ただし、代わりにDBにクエリを実行すると、回答は14になります。

SELECT CHAR_LENGTH(text) FROM locales WHERE lang = 'ru-RU' AND name = 'lang_name'

誰かが私が間違っているかもしれないことについて何か考えをしますか?照合がutf8_general_ciであり、テーブルがMyISAMであることを確認できます。

ありがとう、エイドリアン

編集:私の最終的な目的は、1バイトおよび2バイトの文字を含むテーブルのレコードの長さを測定できるようにすることです(たとえば、英語とロシア語、ただしこれら2つの言語のみに限定されません)

4

2 に答える 2

2

各UTF8文字に2バイトが使用されるため。http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_char-lengthを参照してください

mysql> set names utf8;
mysql> SELECT CHAR_LENGTH('Русский'); result - 7
mysql> SELECT CHAR_LENGTH('test'); result  - 4

create table test123 (
text VARCHAR(255) NOT NULL DEFAULT '',
text_text TEXT) Engine=Innodb default charset=UTF8;

insert into test123 VALUES('русский','test русский');

SELECT CHAR_LENGTH(text),CHAR_LENGTH(text_text) from test123; result - 7 and 12

私は次のコマンドで作業をテストしました:set names koi8r; テーブルなどを作成し、無効な結果を取得しました。したがって、解決策は、テーブルを再作成し、セット名UTF8を設定した後にすべてのデータを挿入することです。

于 2011-08-17T17:35:42.780 に答える
1


関数は、列の場合は使用可能な最も隣接する文字セット、リテラルの場合は列定義によってガイドされる応答を返し
ます。接続のデフォルト
では、列の文字セットを次のように確認します。

SELECT CHARACTER_SET_NAME FROM information_schema.`COLUMNS` 
where table_name = 'locales'
and column_name = 'text'

注意してください、それはtable_schemaによってフィルタリングされません

于 2011-08-17T18:13:00.457 に答える