Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Mysql的Unicode字符_Php_Mysql_Unicode - Fatal编程技术网

Php 使用Mysql的Unicode字符

Php 使用Mysql的Unicode字符,php,mysql,unicode,Php,Mysql,Unicode,我已经在MySql数据库中设置了我的字符集“utf8 turkish ci”。因为我将在我的项目中存储一些土耳其字符。我可以正确地输入土耳其语字符并看到它们。但我的问题是: 例如,我将“username”定义为varhar(20),inputbox的最大长度为20。这意味着用户不能写入任何超过20个字符的用户名。但当用户使用土耳其语unicode字符(如ş,i,ü,ğ)时,会出现“数据对于“username”列太长”错误,因为unicode字符有2个字节长 我试图用phpmyadmin更新我的数

我已经在MySql数据库中设置了我的字符集“utf8 turkish ci”。因为我将在我的项目中存储一些土耳其字符。我可以正确地输入土耳其语字符并看到它们。但我的问题是:

例如,我将“username”定义为varhar(20),inputbox的最大长度为20。这意味着用户不能写入任何超过20个字符的用户名。但当用户使用土耳其语unicode字符(如ş,i,ü,ğ)时,会出现“数据对于“username”列太长”错误,因为unicode字符有2个字节长


我试图用phpmyadmin更新我的数据库。但是更新长度会带来更多的错误。所以我必须放下所有的表格,用x2长度写它们吗?(我的意思是,如果数据是20个字符,我将其定义为varchar(40)),我有30个表,这是一场噩梦。有什么方法可以做吗?

MySQL默认情况下将使用3个字节来存储指定为UTF8的VARCHAR的任何字符(或UTF8MB4的4个字节)


VARCHAR(10)实际上意味着10个字符,30个字节。这并不意味着10个字节。

默认情况下,MySQL将使用3个字节来存储指定为UTF8的VARCHAR的任何字符(或UTF8MB4的4个字节)


VARCHAR(10)实际上意味着10个字符,30个字节。它并不意味着10个字节。

我怀疑您的
需要包含字符集:
我怀疑您的
需要包含字符集:

是的,字段是varchar(20)utf8\u-ci。我尝试输入10个unicode字符,但没有出现错误。但当我尝试输入11个unicode字符时,会导致“太长”错误。所以我看到unicode字符使用2个字节。我必须改变我所有的数据库:(utf8\u unicode\u ci(utf8mb4\u unicode\u ci)就是这样一个东西错误,以及是什么决定了它?这是一个您实际上从mysql中得到的错误,还是一个php由于正在进行某种初步的字符串计数而呈现的错误?我认为这将帮助您,
VARCHAR
CHAR
长度定义只考虑字符长度,而不考虑每个字符的字节数。您是否使用InnoDb?您应该查看“是”,字段是varchar(20)utf8\u turkish\u ci。我尝试输入10个unicode字符,但没有出现错误。但当我尝试输入11个unicode字符时,会导致“太长”错误。因此,我看到unicode字符使用2个字节。并且必须更改我的所有数据库:(utf8\u unicode\u ci(utf8mb4\u unicode\u ci)更多阅读:你在哪里看到这个“太长”呢错误,以及是什么决定了它?这是一个您实际上从mysql中得到的错误,还是一个php由于正在进行某种初步的字符串计数而呈现的错误?我认为这将帮助您,
VARCHAR
CHAR
长度定义只考虑字符长度,而不考虑每个字符的字节数。您是否使用InnoDb?你应该看看,不,它不“使用3个字节”,它“最多使用3个字节”。英文字母为1字节;西欧重音字母为2字节;等等。土耳其语的UTF-8字符每个为1或2字节,里拉除外。@RickJames您通常说UTF-8是正确的,但MySQL不这样处理是一个常见的混淆。因此,当您将一列指定为UTF-8时,MySQL绝对以sto结尾在它的底层存储引擎中,按每个字符3个字节的形式对其进行环化。这很容易测试,但这里有一个参考:和
VARCHAR(10)…utf8
实现为一个长度字段(1字节)和最多30个字节的文本。如果将
'a'
存储到这样的列中,则占用的空间为2个字节(1个表示长度,1个表示字符)存储土耳其语
“ü”
需要3个字节(1表示长度,2表示十六进制
C3BC
,utf8编码表示“小写字母u带分音符”。这是一个有趣的理论。但它是错误的。或者你有某种形式的“证明”吗?不,它不“使用3个字节”,它“最多使用3个字节”。英文字母为1字节;西欧重音字母为2字节;等等。土耳其语的UTF-8字符每个为1或2字节,里拉除外。@RickJames您通常说UTF-8是正确的,但MySQL不这样处理是一个常见的混淆。因此,当您将一列指定为UTF-8时,MySQL绝对以sto结尾在它的底层存储引擎中,按每个字符3个字节的形式对其进行环化。这很容易测试,但这里有一个参考:和
VARCHAR(10)…utf8
实现为一个长度字段(1字节)和最多30个字节的文本。如果将
'a'
存储到这样的列中,则占用的空间为2个字节(1个表示长度,1个表示字符)存储土耳其语
“ü”
需要3个字节(1表示长度,2表示十六进制
C3BC
,utf8编码表示“带分音符的小写字母u”。这是一个有趣的理论。但它是错误的。或者你有某种形式的“证明”吗?