mysql和php字符長度判斷

2021-01-08 心若野馬

問題

最近工作中遇到一個問題,資料庫欄位設置的varchar(255),測試測的時候總是在臨界點那邊給我提bug,今天研究一下mysql和php字符長度判斷。

環境

php7.2.9mysql8.0.12測試時文件的編碼方式要是UTF8資料庫欄位類型大小為 varchar(255),php中用strlen()與mb_strlen()函數。

注意

需要注意的是,mb_strlen並不是PHP核心函數,使用前需要確保在php.ini中加載了php_mbstring.dll,即確保「extension=php_mbstring.dll」這一行存在並且沒有被注釋掉,否則會出現未定義函 數的問題。

分析

考慮到漢字的特殊性,我們測試主要分為兩種,一個是純漢字,一個是純英文字母。

純漢字

準備一個255個漢字的字符串,然後提交資料庫查看結果。

//255個漢字這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個漢字的句子這是個十個php函數的結果

我們在提交前,看一下這兩個php函數分別返回的值是多少

dd(strlen($this->beizhu),mb_strlen($this->beizhu,'UTF8') );結果

可以看出mb_strlen($this->beizhu,』UTF8』),是我們要的結果。

提交到資料庫

提交後發現可以成功保存:

我們把加一個漢字,繼續提交,結果如下:

SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'remark' at row 1此時資料庫報錯了。所以,該環境下varchar(255),可以存的漢字數是255個。

純字母

我們以同樣的方式測試字母,首先準備255個字母的字符串。

// 255個字母ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEphp函數的結果

我們在提交前,看一下這兩個php函數分別返回的值是多少

dd(strlen($this->beizhu),mb_strlen($this->beizhu,'UTF8') );結果

字母的情況下,php的strlen和mb_strlen($str,』UTF8』)得到的結果一樣,都是返回255.

提交到資料庫

測試是可以保存的,我們再往裡面加個字母,可以發現報同樣的錯誤。

結論

php在判斷欄位長度的時候用mb_strlen($str,'UTF8'),可以得到和我們輸入字符一樣的結果。

計算時,選定內碼為UTF8,則會將一個中文字符當作長度1來計算,所以「中文a字1符」長度是6 ,雖然上面函數可以簡單解決一些中英文混合問題,但是不能用於實際中,下面我來給各位朋友介紹其它比較好的辦法。PHP獲取中英文混合字符串長度的實現代碼如下,1中文=1位,2英文=1位,可自行修改。

mb_strlen($str,'UTF8')高版本 MySQL 中的 VARCHAR(255) 可以存放 1 - 255 個 UTF-8 格式的字符。

相關焦點

  • PHP零基礎入門
    string rtrim(string $str[,string $charlist])trim函數用於實現刪除字符串開始和結束的位置刪除空格。session會話控制php操作mysqlmysql非永久連接,性能比較低mysqli永久連接,減輕伺服器壓力pdo能實現mysqli的常用功能mysql連接資料庫連接資料庫mysql_connect($server, $username, $password)選擇資料庫
  • 詳解PHP操作MySQL資料庫
    php header('COntent-Type:text/html;charset=utf-8');//設置頁面編碼,如果文件是gbk編碼,則charset也應用gbk //@表示如果出錯了,不要報錯,直接忽略 //參數:伺服器地址,用戶名和密碼 echo (!!
  • PHP+MySQL應用中使用XOR運算加密算法
    ,包含資料庫配置信息7require_once("encrypy_xor.php");//包含xor加密函數文件89//連接資料庫10$link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);11mysql_select_db($DBNAME);//選擇資料庫my_chat12
  • 從Web查詢資料庫之PHP與MySQL篇
    從Web查詢資料庫:Web資料庫架構的工作原理 一個用戶的瀏覽器發出一個HTTP請求,請求特定的Web頁面,在該頁面中出發form表單提交到php腳本文件(如:results.php)中處理 Web伺服器接收到對results.php頁面的請求後,檢索文件,並將其傳遞給PHP引擎處理 PHP引擎開始解析腳本
  • php字符串常用處理,運算符和幾個常用的字符串函數
    本篇將介紹php字符串常用處理,運算符和幾個常用的字符串函數。有興趣的朋友可以了解一下!php是一門很受歡迎的程式語言之一,由於它的語法簡單易學,迎來了一大批的自學者,小編就是其中一個。php確實相當於其它語言(java、c#等等)比較簡單,但是對一個毫無程式語言基礎的人來說,還是有一定難度的。
  • PHP面試題:mysql中int長度限制具體的意義是什麼
    這道題是mysql資料庫庫設計相關的。在php程式設計師中有很多人都知道設計表的時候,int默認是11長度,但是卻沒有注意過這個長度並不影響能存儲的數據大小。無論你設int(11)還是int(3)都可以支持32位的數字表示不然還要那些tinyint,smallint欄位類型做什麼呢,通過長度設置就可以了。所以要記住:int()括號中的數字並不是設置數據大小限制的。那麼有什麼用呢?
  • Mysql 手工注入【常規union查詢篇】
    >mysql 專有的字符串截取,也就是說只有在mysql中有,mssql和oracle以及pgsql中都沒有mid(要截取的字符串,從什麼地方開始截取,截取多長)mysql> select mid(username,1,1) from admin;
  • CentOS上安裝 Apache、MySQL8 或MariaDB10和 PHP7
    本文介紹了如何安裝最新版本的 Apache, MySQL 8 或者 MariaDB 10 和 PHP 7 以及所需的 PHP 模塊 RHEL / CentOS 7/6 和 Fedora 24-29.我們將用 EPEL 和 Remi存儲庫並使用yum和dnf(Fedora 中可用的新包管理工具)。
  • 由MySQL字符串函數考慮到的繞過利用
    str的最左面字符的ASCII代碼值。mysql> select CONV("a",16,2); -> '1010'bin():返回數字的二進位表示形式,作為字符串值(注意:必須是數字)oct():函數返回數字N的八進位數的字符串表示,這相當於使用CONV(N,10,8)。
  • PHP substr()函數的用法詳解
    如果 start_position是負數,返回的字符串將從 string 結尾處向前數第 start 個字符開始。這也是一個強制參數。string_length_to_cut:此參數是可選的,為整數類型。這指的是需要從原始字符串中剪切的字符串部分的長度。如果整數是正數,則它指的是從start_position開始並從頭開始提取長度。
  • php字符串函數匯總
    二進位安全字符串比較strcoll — 基於區域設置的字符串比較strcspn — 獲取不匹配遮罩的起始子字符串的長度strip_tags — 從字符串中去除 HTML 和 PHP 標記stripcslashes — 反引用一個使用 addcslashes 轉義的字符串stripos — 查找字符串首次出現的位置(不區分大小寫)
  • PHP一些常見的漏洞梳理
    :\\program files\\mysql\\data\\mysql\\user.myd# mysql root密碼c:\\windows\\php.ini# php配置信息c:\\windows\\my.ini# mysql配置信息----/root/.ssh/authorized_keys/root/.ssh/id_rsa/root/.ssh/id_ras.keystore/root/.ssh
  • PHP和MySQL實現簡單的網頁計數器
    源 / php中文網      源 / www.php.cn網站統計數據為網站所有者提供關於網站運行情況和訪問人數的重要信息。點擊計數器計數並顯示有多少人訪問一個網頁。計數器的代碼根據所使用的程式語言和希望計數器收集的信息量而變化。如果您像許多網站所有者一樣,在您的網站上使用PHP和MySQL,那麼您可以使用PHP和MySQL為您的網頁生成一個簡單的命中計數器。計數器將命中總數存儲在MySQL資料庫中。首先,創建一個表來保存計數器統計信息。
  • 重要的PHP面試問題和答案
    Ans: 語法: array explode (string $delimiter, string $string [, int $limit ]);這個函數的作用是將字符串分解為數組。每個數組元素是字符串的子字符串,通過將其分割在由字符串分隔符形成的邊界上而形成。
  • (實用篇)php中計算中文字符串長度、截取中文字符串的函數代碼
    以下是文章分享1群,由於群人數已超過300,不能掃碼進群,這個任務呢,就由小篇來拉你們進群了,掃描下面二維碼,加小篇好友~在PHP中,我們都知道有專門的mb_substr和mb_strlen函數,可以對中文進行截取和計算長度,但是,由於這些函數並非PHP的核心函數,所以,它們常常有可能沒有開啟。
  • (理論篇)溫故而知新_PHP入門基礎教程
    學習目的:掌握php的流程控制1、if..else 循環有三種結構第一種是只有用到 if 條件,當作單純的判斷。解釋成 "若發生了某事則怎樣處理"。語法如下:if (expr) { statement }其中的 expr 為判斷的條件,通常都是用邏輯運算符號當判斷的條件。
  • 考前複習必備MySQL資料庫(關係型資料庫管理系統)
    MySQL 5.0 以上的版本1、一個漢字佔多少長度與編碼有關:UTF-8:一個漢字=3個字節GBK:一個漢字=2個字節2、varchar(n) 表示 n 個字符,無論漢字和英文,Mysql 都能存入 n 個字符,僅是實際字節長度有所區別3、MySQL 檢查長度,可用 SQL 語言來查看MySQL 創建數據表表名
  • 完全講解PHP+MySQL的分頁顯示示例分析
    一、分頁程序的原理 分頁程序有兩個非常重要的參數:每頁顯示幾條記錄($pagesize)和當前是第幾頁($page)。有了這兩個參數就可以很方便的寫出分頁程序,我們以MySql資料庫作為數據源,在MySQL裡如果要想取出表內某段特定內容可以使用的T-SQL語句:select * from table limit offset,rows來實現。
  • 靜態/動態編譯在apache+php+mysql的應用
    我今天就以apache+mysql+php說一下靜態編譯和DSO動態編譯的區別,我會分別拿apache1.3.27和apache2.0.46說明,因為兩個版本的編譯命令是有所區別的。系統和所需軟體:Redhat9.0apache:1.3.27和2.0.46php:4.3.2mysql:4.0.131.首先來安裝mysql,這不是我們的重點,所以關於mysql的安裝配置我就很快過去了tarzvxfmysql-4.0.13.tar.gzcdmysql-4.0.13.
  • Php常見問題總結
    > 然後在php.ini中設置:include_path = "c:/php",並將debug.php放在此文件夾,以後就可以在每個網頁裡包含此文件,查看得到的變量名和值.5:如何截取指定長度漢字而不會出現以"?>"結尾,超出部分以"..."代替一般來說,要截取的變量來自Mysql,首先要保證那個欄位長度要足夠長,一般為char(200),可以保持100個漢字,包括標點.