PHP查詢MSSQL的問題。

來源:互聯網
上載者:User
MSSQL中,欄位名NAME, 欄位內容是中文,欄位類型 VACHAR(50) ,定序:SQL_Latin1_General_CP1_CI_AS (這個不可以改動)

PHP串連SQL通過其他相關內容查詢出NAME可以正常顯示中文,但是我通過查詢NAME,就無法查詢了,是不是要轉換編碼呢?

例如: select * from username where id=123
可以顯示name為張三

但是反過來:select * from username where name=張三
就找不到了。

我知道可以把定序改下,但是改了其他地方又是亂碼了。所以排序不能改。


回複討論(解決方案)

select * from username where name='張三'

一樣的,不是單引號的問題。

首先你需要保證你的 sql 指令不會出現語法錯誤
然後才能探測有效寫法

你可以逐次改變條件的字元集,可能就會有一次成功

SQL_Latin1_General_CP1_CI_AS
是歐洲變音符號集第一套(單位元組),理論上可覆蓋所有字元
但實際上有個內部的字元集轉換,能否正常的支援多位元組字元集就是個問題

記得以前有一次讀書的時候用mysql 建資料庫 也是設的 latin 字元集, 寫項目的時候 也是可以存,但是做搜尋功能就搜不出了,後面自己想去把資料轉成utf8,但是一轉,資料庫裡全是拉丁文。。當時只是隨便建的練習項目,就沒有糾結下去了,最好還是能存和項目一致的編碼吧,不然以後多麻煩。

奇怪的是,如果我通過表裡的其他內容查詢出來的,name裡的中文,能夠正常顯示輸出,直接查詢中文name就搜尋不到。
NAME欄位裡存的內容 ÖÐÎÄ(中文)ËÑË÷(搜尋)我把這個亂碼sql查詢都可以查詢到

你把通過其他內容查詢出的 name 用 base64 編碼後貼出了
比如產訊出的 name 欄位把存在 $name 中,就
echo base64_encode($name);
貼出結果

gbk 環境中有

header('Content-type: text/html;charset=utf-8');echo utf8_encode('中文'); //ÖÐÎÄecho utf8_encode('搜尋'); //ËÑË÷

你把通過其他內容查詢出的 name 用 base64 編碼後貼出了
比如產訊出的 name 欄位把存在 $name 中,就
echo base64_encode($name);
貼出結果

gbk 環境中有

header('Content-type: text/html;charset=utf-8');echo utf8_encode('中文'); //ÖÐÎÄecho utf8_encode('搜尋'); //ËÑË÷



謝謝版大回複。

$str=utf8_encode('中文');echo $str;echo base64_encode($str);$r=mssql_query("select *  from users  where Name='".$str."'");


顯示把 中文 二字轉換出來複製進sql工具可以查詢,為什麼在php裡還是找不到呢?

把你的sql語句先在phpmyadmin 中試一下呢。

你不是 select * from username where id=123
可以顯示name為張三
我讓你貼出 name 的值的 base64 編碼

你不是 select * from username where id=123
可以顯示name為張三
我讓你貼出 name 的值的 base64 編碼



對這樣可以正常顯示中文
中文 的BASE64 1tDOxA==搜尋 的BASE64 y9HL9w== 

你是怎麼得到 base64 編碼串的?
不會是 echo base64_encode('中文'); 這樣的吧?

不是啊。我是查詢出來結果,
php中查詢語句:

$r=mssql_query("select *  from users where denglu=1");

查詢結果直接BASE64的:
base64_encode($row[1])

你是怎麼得到 base64 編碼串的?
不會是 echo base64_encode('中文'); 這樣的吧?



不是啊。我是查詢出來結果,
php中查詢語句:
$r=mssql_query("select *  from users where denglu=1");


查詢結果直接BASE64的:
base64_encode($row[1])


如果版主你方便,我QQ遠程給你看

編碼問題,你的php預設編碼不一致,傳給mysql的值並不是'張三',當然無法查詢.
可以嘗試把php header("Content-type: text/html; charset=latin1");

編碼問題,你的php預設編碼不一致,傳給mysql的值並不是'張三',當然無法查詢.
可以嘗試把php header("Content-type: text/html; charset=latin1");



我已經把php編碼改成UTF8了。語句輸出也是:
select * from server01.dbo.cabal_character_table where name='ÖÐÎÄ' //在資料庫裡的顯示和這個一樣,在sql工具直接執行此命令可以搜尋到,這個是UTF8編碼後的字元,原文是:中文

where name='ÖÐÎÄ'

你這個亂碼值,在資料是否是亂碼的?

where name='ÖÐÎÄ'

你這個亂碼值,在資料是否是亂碼的?



是的,資料庫裡查詢出來就是這樣。



我在想mssql有沒有什麼轉換語句,能在查詢的時候把列名的資料類型轉換一下。例如:

select 這裡轉換NAME為16進位或者CHAR from name where name= 這裡把字元轉換成16進位或者CHAR

我比較好奇的是,為什麼通過其他列名例如name=張三 id=1,通過查詢id=1,php查詢出來能正常轉換成中文,反過來卻不行,

php預設設定GB2312, mssql是GBK,name這列是varchar(50)儲存方式是ISO-8859-1

首先你要解決資料庫內容亂碼的問題,亂碼解決了,下一步就是讀取讀取資料編碼問題。

首先你要解決資料庫內容亂碼的問題,亂碼解決了,下一步就是讀取讀取資料編碼問題。



資料庫亂碼沒法解決。不在我控制範圍。只有想辦法讀取,實在不行就算了。

你存進去的時候是以utf8或者gbk的編碼格式存進的中文
以latin1編碼儲存
你取出來的時候以utf8或者gbk的形式取,當然得到的是正確的中文
如果你以latin1編碼取,取的就是資料庫裡存的亂碼,應該完全一致.
如果你想通過資料庫操作來查詢中文,你應該查詢的是gbk轉latin1的那段編碼
比較無聊...iconv好像不能轉utf8的中文到ISO-8859-1//IGNORE
個人覺得沒什麼意思...看你自己了...這樣轉來轉去也不可能用什麼模糊搜尋
資料存成這樣 可夠操作的方向非常少

你試試直接在資料庫裡運行select * from username where name='張三',應該可以運行出來呀

改下串連庫編碼唄,UTF8

自己已經解決了。結貼了。感謝各位的熱心回答和協助!謝謝你們!!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.