2012-06-13 11 views
5

私はTEXTカラムを使用しています。これは、mysqlでut8_unicode_ciという名前のカラムを使用しています。mysqlの列の長さが長く、utf8_unicode_ci - PHPを使用してその限界を超えないようにしていますか?

収集されるテキストは、さまざまな言語のさまざまなサイトからのものです。

TEXTの列の最大長が65535バイトで混乱しています。

カラムに挿入する文字列がその制限を超えていないことを確認するにはどうすればよいですか?

私はstrlen($str)を使用して文字列の長さを確認していますが、これを使用して、理解できるようにデータが列に収まるように切り捨てられないことを確認します。utf8_unicode_ciは1バイト文字ごとに?

+0

mb_strlen()を使ってみましたか? http://php.net/manual/es/function.mb-strlen.php –

+0

はい、 'mb_strlen($ str)!= strlen($ str)'のすべての場合、 'strlen'の実際の結果は次のとおりです。 'mb_strlen'からの結果と' mb_strlen'からの結果はマルチバイト文字を1としてカウントします – hadley

+0

これは解決策ではありませんが、スペースを使い果たしている場合はMEDIUMTEXT(16777215 chars)またはLONG​​TEXT(4294967295 chars)ちょうどテキスト。 – AleksanderKseniya

答えて

3

EDIT:それはバイトを返すよう OPは、単に、strlen()をしない使用することができ文字。証人:

$ cat test.php 
#!/usr/bin/php -q 
<?php 
echo strlen("דותן כהן")."\n"; 
echo mb_strlen("דותן כהן", "UTF-8")."\n"; 
?> 

$ ./test.php 
15 
8 

クレジットがこの投稿へのコメントにdecezeに行きます。以下

旧ポスト:PHPマニュアルの

ノートはa handy function for determining how many bytes are in a stringを持っています。それはMYSQL built in functions such as LENGTH to do the jobを使用する唯一の選択肢のようですが、ここでは面倒です。

他にも2つの回避策が考えられます。まず、文字列をファイルに書き込んで、ファイルのサイズを確認することができます。次に、mb_strlenでASCIIエンコーディングを強制すると、各バイトが文字として扱われるため、実際に返される文字数はバイト数になります。私はこれをテストしていないので、最初に確認してください。何があなたのために働くのか教えてください!

+0

あなたが実際にやる必要があるのは、['strlen'](http://php.net/strlen)の期間です。文字列をファイルに書き込んでそのサイズをチェックすることは、単純にバイト数をカウントする 'strlen'を使うことと同じです。 – deceze

+0

'strlen'はcountバイトです。これは、1バイトが1文字に等しいと仮定している単純なPHPコア関数の1つです。 mb_strlen( '漢'、 'UTF-8')は文字を正しく数え、 '1'を返すのに対し、' strlen( '漢') 'はバイトを数えるので' 3'を返します。 – deceze

+0

@deceze:あなたは正しいです。私は 'strlen("דותןכהן ")'と 'mb_strlen("דותןכהן "、" UTF-8 ")'でテストしました。前者は15を印刷し、後者は8を印刷します。ありがとう! – dotancohen

0

チェックアウトのMySQL関数LENGTH():

は、バイト単位で測定された、文字列strの長さを返します。マルチバイトの 文字は複数のバイト数です。これは、5つの2バイト文字を含む文字列 ため、長さが() CHAR_LENGTH()を返し、一方、10返すことを意味5

関連する問題