ホームページ >バックエンド開発 >PHPチュートリアル >PHP クエリ MSSQL の問題。
MSSQL では、フィールド名は NAME、フィールドの内容は中国語、フィールド タイプは VACHAR(50)、並べ替えルールは次のとおりです: SQL_Latin1_General_CP1_CI_AS (これは変更できません)
PHP は SQL に接続し、他の関連するメソッドを通じて NAME をクエリします内容を確認すると、中国語は正常に表示されますが、NAME をクエリすると、エンコーディングを変換する必要がありますか?
例: select * from username where id=123
は名前を Zhang San として表示できます
しかし、その逆: select * from username where name=Zhang San
は見つかりません。
並べ替えルールを変更できることはわかっていますが、他の場所を変更するとコードが文字化けします。したがって、並べ替えは変更できません。
select * from username where name='Zhang San'
同じように、一重引用符の問題ではありません。
まず第一に、SQL コマンドに構文エラーがないことを確認する必要があります
その後、有効な書き込みメソッドを検出できます
条件の文字セットを 1 つずつ変更すると、成功する可能性があります
SQL_Latin1_General_CP1_CI_AS
は最初のヨーロッパ文字セット Set (シングルバイト) で、理論的にはすべての文字をカバーできます
しかし、実際には内部文字セット変換があり、通常マルチバイト文字セットをサポートできるかどうかが問題です
覚えています以前、勉強していたときにmysqlを使ってデータベースを構築したのですが、プロジェクトを書くときは保存できるのですが、後で変換したいと思いました。データを utf8 に変換しましたが、変換するとデータベースはすべてラテン語になってしまいました。 。その時は単なる練習プロジェクトだったので、もう気にしませんでした。プロジェクトに一貫したコードを保存しておかないと、将来面倒になります。
奇妙なことに、テーブル内の他のコンテンツを通じて中国語名をクエリすると、出力は正常に表示されますが、中国語名を直接検索することはできません。
NAME フィールドに格納されているコンテンツ ÖÐÎÄ (中国語) ËÑË÷ (検索) この文字化けした SQL クエリをクエリできます
他のコンテンツから見つかった名前を Base64 でエンコードして投稿します
たとえば、生産情報からのものname フィールドは $name に保存されます。
echobase64_encode($name); だけです
結果を投稿します
gbk 環境には
header('Content-type: text/html;charset=utf-8');echo utf8_encode('中文'); //ÖÐÎÄecho utf8_encode('搜索'); //ËÑË÷があります
他のコンテンツから見つかった名前を Base64 でエンコードして投稿します
たとえば出力メッセージの名前フィールドは $name に保存されます。
echobase64_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."'");
まず phpmyadmin で SQL ステートメントを試してください。
select * from username where id=123 ではありません
名前を Zhang San として表示できます
name の値の Base64 エンコーディングを投稿するように依頼しました
あなたは select * from username where id=123 ではありません
名前をZhang Threeとして表示できます
nameの値のbase64エンコードを投稿してもらいました
中文 的BASE64 1tDOxA==搜索 的BASE64 y9HL9w==
Base64エンコード文字列はどうやって取得しましたか?
echobase64_encode('中国語'); のようなものではありませんよね?
いいえ。結果を確認してみたところ、
php のクエリ文:
$r=mssql_query("select * from users where denglu=1");
base64_encode($row[1])
Base64 エンコード文字列をどのように取得しましたか?
echobase64_encode('中国語'); のようなものではありませんよね?
$r=mssql_query("select * from users where denglu=1");
base64_encode($row[1])
エンコードの問題、あなたのphp のデフォルトのエンコーディングは一貫性がありません。mysql に渡される値は「Zhang San」ではありません。もちろん、クエリすることはできません。
php header("Content-type: text/html; charset=latin1");エンコーディングの問題、php のデフォルトのエンコーディングが矛盾しています。mysql に渡される値は「Zhang San」ではありません。もちろんクエリできません。
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='ÖÐÎÄ'
你这个乱码值,在数据是否是乱码的?
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
自己已经解决了。结贴了。感谢各位的热心回答和帮助!谢谢你们!!